Get all the packages ready

Load data

# Load Medland survey collection data
medland_survey2014_2017 <- read_csv("data/medland_survey2014_2017.csv", locale = locale(encoding = "850"))
Rows: 1501 Columns: 28── Column specification ───────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (5): study.area, sector, subsector, visibility, time.date
dbl (23): ID, zone, collection, xcoord, ycoord, area.sqm, undiag.lithics, burins, notch.dent, MP.to...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Figures 1 and 2 generated in GIS software

Figure 3: Surface Visibility and Artifact Recovery

medland_survey2014_2017 %>% 
  dplyr::filter(area.sqm>0 & total.lithics>0 & !is.na(visibility)) %>% 
  mutate(lithic.density=total.lithics/area.sqm) %>% 
  ggplot(aes(x=lithic.density), xlim=.02) + 
  geom_histogram(binwidth = .001) + 
  scale_y_log10() + 
  scale_x_continuous(limits = c(0,0.01), breaks = c(0,.002, .004, .006, .008)) + 
  labs(title = "Surface Visibility and Artifact Recovery",
       x="lithic artifacts / km^2",
       y='count of patches') + 
  facet_grid(factor(visibility)~study.area) + 
  theme_bw(base_size = 20) + 
  theme(axis.title.x = element_markdown())

ANOVA for Figure 3: all survey areas and each survey area

cat("\nCanal de Navarrés survey area\n")

Canal de Navarrés survey area
with(medland_survey2014_2017 %>% 
       dplyr::filter(total.lithics>0 & !is.na(visibility) & study.area == "Canal de Navarrés") %>% 
       mutate(lithic.density=total.lithics/area.sqm), 
  aov(lithic.density~visibility)) %>% summary()
             Df    Sum Sq   Mean Sq F value Pr(>F)
visibility    2 0.0000022 1.104e-06   0.451  0.637
Residuals   194 0.0004746 2.446e-06               
cat("\nHoya de Buñol survey area\n")

Hoya de Buñol survey area
with(medland_survey2014_2017 %>% 
       dplyr::filter(total.lithics>0 & !is.na(visibility) & study.area == "Hoya de Buñol") %>% 
       mutate(lithic.density=total.lithics/area.sqm), 
  aov(lithic.density~visibility)) %>% summary()
            Df    Sum Sq   Mean Sq F value Pr(>F)
visibility   2 1.220e-06 6.095e-07     0.4  0.671
Residuals   98 1.493e-04 1.523e-06               
cat("\nCocina/Catadau survey area\n")

Cocina/Catadau survey area
with(medland_survey2014_2017 %>% 
       dplyr::filter(total.lithics>0 & !is.na(visibility) & study.area == "Cocina/Catadau") %>% 
       mutate(lithic.density=total.lithics/area.sqm), 
  aov(lithic.density~visibility)) %>% summary()
            Df    Sum Sq   Mean Sq F value Pr(>F)  
visibility   2 0.0001894 9.470e-05   2.662 0.0758 .
Residuals   83 0.0029531 3.558e-05                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Random Forest Model for Chronological Unmixing (Figure 4 and Table 4)

Data preparation

Prepare data for Valencia dated assemblages



# Modify training data based on ML and Bayesian testing: 
#  Merge ENEOL and MNEOL
#  Remove undiagnostic lithics for age estimates
#  Sort factor levels chronologically 

training_data_E_Iberia <- training_data_E_Iberia %>% 
  select(-undiag.lithics, -total.lithics, -citation) %>% 
  mutate(period = replace(period, period == "MNEOL", "ENEOL"), 
         period = factor(period,
                         levels = c("MP", "UP", "EPI", "MESO", "ENEOL", "LNEOL")))

Prepare data from survey collections for applying Random Forest model

# filter out assemblages with only undiagnostic lithics
medland_survey2014_2017_lithics <- medland_survey2014_2017 %>% 
  dplyr::filter(undiag.lithics < total.lithics) %>% 
  select(ID, c(13:27))

# make separate table of assemblage ID and provenience
medland_survey2014_2017_info <- medland_survey2014_2017 %>% 
  dplyr::filter(undiag.lithics < total.lithics) %>% 
  mutate(assemblage = paste(study.area, "-", zone, "-", sector, "-", subsector, sep = "")) %>% 
  select(ID, study.area, assemblage)

# calculate lithic density for each collection patch
medland_survey2014_2017_density <- medland_survey2014_2017 %>% 
  dplyr::filter(undiag.lithics < total.lithics) %>% 
  mutate(assemblage = paste(study.area, "-", zone, "-", sector, "-", subsector, sep = ""), 
         density.km2 = total.lithics*1000/area.sqm)%>% 
  select(ID, total.lithics, area.sqm,density.km2)

Split data into training and test sets

# Partition into training and hold out test / validation sample
set.seed(456) ## if we want to make it completely reproducible
vl.split <- training_data_E_Iberia %>% 
  rsample::initial_split(., prop=.75)

vl.train <- rsample::training(vl.split)
vl.test <- rsample::testing(vl.split)

# save ID data for later analysis
vl.test.id <- vl.test %>% 
  select(ID, period)

create v-fold objects for replicable and comparable cross-validation

10 folds using all the training data

set.seed(456)
vf10.all <- vfold_cv(training_data_E_Iberia %>% select(-ID),v=10)

10 folds using the 75% training data split

set.seed(456)
vf10.train <- vfold_cv(vl.train %>% select(-ID),v=10)

Test Random Forest Model for Estimating Age of Surface Assemblages

Create and evaluate RF model using a 75% split (vl.split)

Define and instantiate a random forest model

valencia.lithics.rf.mod <- 
  rand_forest(trees=500) %>% 
  set_engine("ranger", importance = "impurity") %>% 
  set_mode("classification")

print(valencia.lithics.rf.mod)
Random Forest Model Specification (classification)

Main Arguments:
  trees = 500

Engine-Specific Arguments:
  importance = impurity

Computational engine: ranger 

Fit the model to the training data

valencia.lithics.rf.fit <- 
  valencia.lithics.rf.mod %>% 
  fit(as.factor(period) ~ ., data = vl.train[,2:ncol(vl.train)])

print(valencia.lithics.rf.fit)
parsnip model object

Ranger result

Call:
 ranger::ranger(x = maybe_data_frame(x), y = y, num.trees = ~500,      importance = ~"impurity", num.threads = 1, verbose = FALSE,      seed = sample.int(10^5, 1), probability = TRUE) 

Type:                             Probability estimation 
Number of trees:                  500 
Sample size:                      96 
Number of independent variables:  15 
Mtry:                             3 
Target node size:                 10 
Variable importance mode:         impurity 
Splitrule:                        gini 
OOB prediction error (Brier s.):  0.2416893 

Optional graph: variable importance for random forest model with training set

valencia.lithics.rf.fit %>% 
  extract_fit_engine() %>% 
  vip(aesthetics = list(color = "black", fill = "#26ACB5"), num_features = 15) + theme_minimal()

Extract the fitted data

valencia.lithics.rf.predicted <- 
  valencia.lithics.rf.fit %>% 
  predict(vl.test) %>% 
  bind_cols(vl.test.id[1:2], ., predict(valencia.lithics.rf.fit, vl.test, type="prob")) %>% 
  rename(predicted.age = .pred_class, 
         MP=.pred_MP,
         UP=.pred_UP,
         EPI=.pred_EPI, 
         MESO=.pred_MESO, 
         ENEOL=.pred_ENEOL, 
         LNEOL=.pred_LNEOL, 
         true.age = period) %>% 
  mutate(true.age = factor(true.age, 
           levels=c("MP", "UP", "EPI", "MESO", "ENEOL", "LNEOL")),
         predicted.age = factor(predicted.age, 
           levels=c("MP", "UP", "EPI", "MESO", "ENEOL", "LNEOL")))

print(valencia.lithics.rf.predicted)

Figure 4: Graph random forest predictions for test set

valencia.lithics.rf.predicted %>% 
  pivot_longer(cols = 4:ncol(valencia.lithics.rf.predicted), 
               names_to = "period", values_to = "probability") %>% 
  mutate(period = factor(period, 
      levels = c("MP", "UP", "EPI", "MESO", "ENEOL", "LNEOL"))) %>%
  ggplot(aes(x=period, y=probability)) + 
  geom_line(group=1) + 
  geom_vline(aes(xintercept = true.age), color="red", size=2, alpha=.5) +
  geom_vline(aes(xintercept = predicted.age), color="blue", size=0.8) + 
  labs(title="Random Forest Predictions for Each Assemblage", 
       subtitle="black line indicates probability, blue line indicates predicted age, & red line indicates known age",
       x="time period",
       y="probability of predicted time period") + 
  facet_wrap(vars(ID), ncol = 7) + 
  theme_bw(base_size = 20) + 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1), 
        strip.text.x = element_text(size = 14))

Create confusion matrix for 75% training/test split

library(caret)
with(valencia.lithics.rf.predicted,  
  caret::confusionMatrix(true.age, predicted.age))
Confusion Matrix and Statistics

          Reference
Prediction MP UP EPI MESO ENEOL LNEOL
     MP    13  0   0    0     0     0
     UP     0  2   0    0     2     0
     EPI    0  1   1    1     0     0
     MESO   0  0   0    3     1     0
     ENEOL  0  0   0    1     5     0
     LNEOL  0  0   0    0     2     1

Overall Statistics
                                          
               Accuracy : 0.7576          
                 95% CI : (0.5774, 0.8891)
    No Information Rate : 0.3939          
    P-Value [Acc > NIR] : 2.407e-05       
                                          
                  Kappa : 0.6788          
                                          
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                     Class: MP Class: UP Class: EPI Class: MESO Class: ENEOL Class: LNEOL
Sensitivity             1.0000   0.66667    1.00000     0.60000       0.5000      1.00000
Specificity             1.0000   0.93333    0.93750     0.96429       0.9565      0.93750
Pos Pred Value          1.0000   0.50000    0.33333     0.75000       0.8333      0.33333
Neg Pred Value          1.0000   0.96552    1.00000     0.93103       0.8148      1.00000
Prevalence              0.3939   0.09091    0.03030     0.15152       0.3030      0.03030
Detection Rate          0.3939   0.06061    0.03030     0.09091       0.1515      0.03030
Detection Prevalence    0.3939   0.12121    0.09091     0.12121       0.1818      0.09091
Balanced Accuracy       1.0000   0.80000    0.96875     0.78214       0.7283      0.96875

Create and evaluate cross-validated random forest model using 10 folds

Define and instantiate a random forest model workflow and fit to cross-validated data set

#Create workflow step
valencia.lithics.rf.wf <- 
  workflow() %>% 
  add_model(valencia.lithics.rf.mod) %>% 
  add_formula(period ~ .) #The predictor is contained in add_formula method

set.seed(456) # For reproducibility
valencia.lithics.rf.xv.fit <- 
  valencia.lithics.rf.wf %>% 
  fit_resamples(vf10.all,
                control=control_resamples(save_pred = TRUE))
! Fold01: internal: No observations were detected in `truth` for level(s): 'UP', 'LNEOL'
Computation will...
! Fold02: internal: No observations were detected in `truth` for level(s): 'EPI', 'LNEOL'
Computation wil...
! Fold03: internal: No observations were detected in `truth` for level(s): 'EPI', 'LNEOL'
Computation wil...
! Fold04: internal: No observations were detected in `truth` for level(s): 'UP'
Computation will proceed ...
! Fold06: internal: No observations were detected in `truth` for level(s): 'EPI', 'MESO'
Computation will...
! Fold09: internal: No observations were detected in `truth` for level(s): 'LNEOL'
Computation will proce...
! Fold10: internal: No observations were detected in `truth` for level(s): 'EPI', 'LNEOL'
Computation wil...
print(valencia.lithics.rf.xv.fit)
# Resampling results
# 10-fold cross-validation 

There were issues with some computations:

  - Warning(s) x3: No observations were detected in `truth` for level(s): 'EPI', 'LNEOL' Computation wi...   - Warning(s) x1: No observations were detected in `truth` for level(s): 'EPI', 'LNEOL' Computation wi...   - Warning(s) x1: No observations were detected in `truth` for level(s): 'EPI', 'LNEOL' Computation wi...   - Warning(s) x1: No observations were detected in `truth` for level(s): 'EPI', 'LNEOL' Computation wi...   - Warning(s) x1: No observations were detected in `truth` for level(s): 'EPI', 'LNEOL' Computation wi...

Use `collect_notes(object)` for more information.

Collect the cross-validated metrics

# Collect the metrics using another model with cross-validation
valencia.lithics.rf.xv.meanpreds <- tune::collect_metrics(valencia.lithics.rf.xv.fit)
print(valencia.lithics.rf.xv.meanpreds)

Optional Graph: variable importance for cross-validated random forest model

valencia.lithics.rf.mod %>% 
  fit(as.factor(period) ~ ., data = training_data_E_Iberia[,2:ncol(training_data_E_Iberia)]) %>% 
  extract_fit_engine() %>% 
  vip(aesthetics = list(color = "black", fill = "#26ACB5"), num_features = 15) + 
  theme_minimal()

Extract predictions of random forest model with cross-validation

valencia.lithics.rf.xv.predictions <- collect_predictions(valencia.lithics.rf.xv.fit, summarize = TRUE) %>% 
  arrange(.row) %>% 
  rename(predicted.age = .pred_class,
         MP=.pred_MP,
         UP=.pred_UP,
         EPI=.pred_EPI, 
         MESO=.pred_MESO, 
         ENEOL=.pred_ENEOL, 
         LNEOL=.pred_LNEOL,
         true.age=period) %>% 
  select(-.row, -.config) %>% 
  relocate(predicted.age, .after = true.age) %>% 
  bind_cols(training_data_E_Iberia[1], .)

print(valencia.lithics.rf.xv.predictions)

Optional Graph: results for cross-validated random forest predictions

valencia.lithics.rf.xv.predictions %>% 
  pivot_longer(cols = 4:ncol(valencia.lithics.rf.xv.predictions), names_to = "period", values_to = "probability") %>% 
  mutate(period = factor(period, levels = c("MP","UP","EPI","MESO","ENEOL","MNEOL","LNEOL"))) %>% 
ggplot(aes(x=period, y=probability)) + 
  geom_line(group=1) + 
  geom_vline(aes(xintercept = true.age), color="red", size=2, alpha=.5) +
  geom_vline(aes(xintercept = predicted.age), color="blue", size=0.8) + 
  labs(title="Random Forest with Cross-Validated Predictions", 
       subtitle="Time Periods for Each Assemblage",
       x="predicted time period\n(blue line indicates prediction & red line indicates radiocarbon age)") +
  facet_wrap(vars(ID)) + 
  theme_bw(base_size = 16) + 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))

Table 4: Confusion matrix for cross-validated random forest predictions

caret::confusionMatrix(
  as.factor(valencia.lithics.rf.xv.predictions$true.age),
  as.factor(valencia.lithics.rf.xv.predictions$predicted.age))
Confusion Matrix and Statistics

          Reference
Prediction MP UP EPI MESO ENEOL LNEOL
     MP    51  0   0    0     0     0
     UP     0  9   1    0     5     0
     EPI    1  3   2    0     0     0
     MESO   0  3   0   11     5     0
     ENEOL  0  1   0    6    22     0
     LNEOL  0  0   0    0     3     6

Overall Statistics
                                          
               Accuracy : 0.7829          
                 95% CI : (0.7018, 0.8507)
    No Information Rate : 0.4031          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.7073          
                                          
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                     Class: MP Class: UP Class: EPI Class: MESO Class: ENEOL Class: LNEOL
Sensitivity             0.9808   0.56250    0.66667     0.64706       0.6286      1.00000
Specificity             1.0000   0.94690    0.96825     0.92857       0.9255      0.97561
Pos Pred Value          1.0000   0.60000    0.33333     0.57895       0.7586      0.66667
Neg Pred Value          0.9872   0.93860    0.99187     0.94545       0.8700      1.00000
Prevalence              0.4031   0.12403    0.02326     0.13178       0.2713      0.04651
Detection Rate          0.3953   0.06977    0.01550     0.08527       0.1705      0.04651
Detection Prevalence    0.3953   0.11628    0.04651     0.14729       0.2248      0.06977
Balanced Accuracy       0.9904   0.75470    0.81746     0.78782       0.7771      0.98780

Create random forest model from all training data to estimate ages of surface collections from survey

Define and instantiate a Random Forest model using all the known training data

medland.survey.rf.mod <- 
  rand_forest(trees=500) %>% 
  set_engine("ranger") %>% 
  set_mode("classification")

print(medland.survey.rf.mod)
Random Forest Model Specification (classification)

Main Arguments:
  trees = 500

Computational engine: ranger 

Extract fit of Random Forest model

medland.survey.rf.fit <- 
  medland.survey.rf.mod %>% 
  fit(as.factor(period) ~ ., data = training_data_E_Iberia[,2:ncol(training_data_E_Iberia)])

print(medland.survey.rf.fit)
parsnip model object

Ranger result

Call:
 ranger::ranger(x = maybe_data_frame(x), y = y, num.trees = ~500,      num.threads = 1, verbose = FALSE, seed = sample.int(10^5,          1), probability = TRUE) 

Type:                             Probability estimation 
Number of trees:                  500 
Sample size:                      129 
Number of independent variables:  15 
Mtry:                             3 
Target node size:                 10 
Variable importance mode:         none 
Splitrule:                        gini 
OOB prediction error (Brier s.):  0.2341059 

Apply Random Forest model to surface collections and generate age estimate predictions for each collection

medland.survey.rf.predicted <- 
  medland.survey.rf.fit %>% 
  predict(medland_survey2014_2017_lithics) %>% 
  bind_cols(medland_survey2014_2017_info, ., 
            predict(medland.survey.rf.fit, medland_survey2014_2017_lithics, type="prob")) %>% 
  rename(predicted.period = .pred_class, 
         MP=.pred_MP,
         UP=.pred_UP,
         EPI=.pred_EPI, 
         MESO=.pred_MESO, 
         ENEOL=.pred_ENEOL, 
         LNEOL=.pred_LNEOL) %>% 
  mutate(predicted.period = factor(predicted.period, 
           levels=c("MP", "UP", "EPI", "MESO", "ENEOL", "LNEOL")))

print(medland.survey.rf.predicted)

Calculate age probabilities to assign to collections with only undiagostic lithics

Use the 10th percentile of probabilities from random forest model with dated collections

valencia.lithics.rf.probquantiles <- with(valencia.lithics.rf.xv.predictions %>% 
       pivot_longer(cols = 4:ncol(valencia.lithics.rf.xv.predictions), 
                    values_to = "probability"), 
       quantile(probability, probs = c(.1, .25, .5, .75))) 

print(paste("10th percentile of random forest probabilities =", 
            valencia.lithics.rf.probquantiles[1]))
[1] "10th percentile of random forest probabilities = 0.00173557343664358"

Optional Graph: show quantiles for random forest probabilities

# show this in a graph
valencia.lithics.rf.xv.predictions %>% 
  pivot_longer(cols = 4:ncol(valencia.lithics.rf.xv.predictions), names_to = "period", values_to = "probability") %>% 
  mutate(period = factor(period, levels = c("MP","UP","EPI","MESO","ENEOL","MNEOL","LNEOL"))) %>% 
  ggplot(aes(x=probability)) + 
  geom_density() + 
  geom_vline(xintercept = valencia.lithics.rf.probquantiles[1], color = 'red') + 
  geom_vline(xintercept = valencia.lithics.rf.probquantiles[2], color = 'green') + 
  geom_vline(xintercept = valencia.lithics.rf.probquantiles[3], color = 'blue') + 
  geom_vline(xintercept = valencia.lithics.rf.probquantiles[4], color = 'green') +
  labs(title="Distribution of Combined Random Forest Predictions", 
       x="age prediction probabilities \n(blue = median, red = 10th percentile, green = 25th and 75th percentile")

Create files for additional graphing and for output for mapping

# Create base file for graphing and output
medland.survey.rf.graph <-  
  left_join(select(medland_survey2014_2017, ID, study.area, zone, sector, subsector, total.lithics, area.sqm) %>% 
            mutate(assemblage = paste(study.area, "-", zone, "-", sector, "-", subsector, sep = "")), 
            medland.survey.rf.predicted) %>% 
  dplyr::filter(total.lithics>0) %>% 
  mutate(density.km2 = total.lithics/area.sqm/1000)
Joining, by = c("ID", "study.area", "assemblage")
# Create output file
# Use 10th percentile for overall ubiquity for patches with only undiagnostic lithics
medland.survey.rf.out <- medland.survey.rf.graph %>% 
  mutate(MP = replace_na(MP, valencia.lithics.rf.probquantiles[1]), 
         UP = replace_na(UP, valencia.lithics.rf.probquantiles[1]), 
         EPI = replace_na(EPI, valencia.lithics.rf.probquantiles[1]), 
         MESO = replace_na(MESO, valencia.lithics.rf.probquantiles[1]), 
         ENEOL = replace_na(ENEOL, valencia.lithics.rf.probquantiles[1]), 
         LNEOL = replace_na(LNEOL, valencia.lithics.rf.probquantiles[1])) %>% 
  # occupational ubiquity
  rename(MP_ubiq = MP, 
         UP_ubiq = UP, 
         EPI_ubiq = EPI, 
         MESO_ubiq = MESO,
         ENEOL_ubiq = ENEOL, 
         LNEOL_ubiq = LNEOL) %>% 
  # calculate occupational intensity
  mutate(MP_int = MP_ubiq*density.km2/800, 
         UP_int = UP_ubiq*density.km2/250, 
         EPI_int =  EPI_ubiq*density.km2/40, 
         MESO_int = MESO_ubiq*density.km2/35, 
         ENEOL_int = ENEOL_ubiq*density.km2/25, 
         LNEOL_int = LNEOL_ubiq*density.km2/12)

# create file to graph results of patches with diagnostic lithics
medland.survey.rf.graph <-  medland.survey.rf.graph %>% 
  dplyr::filter(!is.na(predicted.period)) %>% 
  pivot_longer(cols = 10:15, 
               names_to = "period", 
               values_to = "ubiquity") %>% 
   mutate(period = factor(period, 
                         levels = c("MP","UP","EPI","MESO","ENEOL","MNEOL","LNEOL")),
         age = case_when(period == "MP" ~ 80000, 
                         period == "UP" ~ 25000, 
                         period == "EPI" ~ 13000, 
                         period == "MESO" ~ 9000, 
                         period == "ENEOL" ~ 6000,
                         period == "LNEOL" ~ 4000), 
         predicted.age = case_when(
                         predicted.period == "MP" ~ 80000, 
                         predicted.period == "UP" ~ 25000, 
                         predicted.period == "EPI" ~ 13000, 
                         predicted.period == "MESO" ~ 9000, 
                         predicted.period == "ENEOL" ~ 6000,
                         predicted.period == "LNEOL" ~ 4000), 
         duration.centuries = case_when(
                         period == "MP" ~ 800, 
                         period == "UP" ~ 250, 
                         period == "EPI" ~ 40, 
                         period == "MESO" ~ 35, 
                         period == "ENEOL" ~ 25,
                         period == "LNEOL" ~ 12))

Optional Graph: occupational ubiquity for all survey patches with diagnostic lithics

medland.survey.rf.graph %>% 
  ggplot(aes(x=period, y=ubiquity)) + 
  geom_rect(aes(fill = study.area),xmin = -Inf,xmax = Inf, ymin = -Inf,ymax = Inf,alpha = 0.1) +
  geom_line(group=1) + 
  #geom_vline(aes(xintercept = predicted.period), color="blue") + 
  labs(title="Random Forest Age Estmates for Medland Survey Data", 
       subtitle="Time Periods for Each Assemblage, Colored by Study Area",
       x="predicted time period\n(blue line indicates maximum predicted probability)") +
  facet_wrap(~ assemblage + ID) + 
  theme_bw(base_size = 16) + 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))

Optional Graph: land use intensity for all survey patches with diagnostic lithics

medland.survey.rf.graph %>% 
  ggplot(aes(x=period, y=ubiquity*density.km2/duration.centuries)) + 
  geom_rect(aes(fill = study.area),xmin = -Inf,xmax = Inf, ymin = -Inf,ymax = Inf,alpha = 0.1) +
  geom_line(group=1) + 
  #geom_vline(aes(xintercept = predicted.period), color="blue") + 
  labs(title="Land Use Intensity Estmates for Medland Survey Data", 
       subtitle="Time Periods for Each Assemblage, Colored by Study Area",
       x="predicted time period\n(blue line indicates maximum predicted probability)",
       y="estimated artifact accumulation rate\n(artifacts/km2/century)") +
  facet_wrap(~ assemblage + ID) + 
  theme_bw(base_size = 16) + 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))

Figure 6a

medland.survey.rf.graph %>% 
  dplyr::filter(ID==238 | ID==960) %>% 
ggplot(aes(x=period, y=ubiquity)) + 
  geom_line(group=1, size=2) + 
  labs(title="Occupational Ubiquity for 2 Survey Patches", 
       subtitle="Random Forest Age Estmates",
       x="predicted time period", 
       y="occupational ubiquity") +
  facet_wrap(~ assemblage) + 
  theme_bw(base_size = 20) + 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))

Figure 6b

medland.survey.rf.graph %>% 
  dplyr::filter(ID==238 | ID==960) %>% 
ggplot(aes(x=period, y=ubiquity*density.km2/duration.centuries)) + 
  geom_line(group=1, size=2) + 
  labs(title="Land Use Intensity for 2 Survey Patches", 
       subtitle="Random Forest Age Estmates",
       x="predicted time period", 
       y="artifacts / km^2 /century") +
  facet_wrap(~ assemblage) + 
  theme_bw(base_size = 20) + 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1), 
        axis.title.y = element_markdown()) 

Save random forest dating file to csv for mappoing in GIS

write_csv(medland.survey.rf.out, "medland_survey_rf.csv")

Aggregate summaries of ubiquity and intensity for each valley

Calcuate area surveyed totals for each valley

totals.surveyed <- medland_survey2014_2017 %>% 
  select(study.area, area.sqm) %>% 
  group_by(study.area) %>% 
  summarise(total.area.sqm=sum(area.sqm))

Figure 10a: aggregate ubiquity for each valley

left_join(medland.survey.rf.graph, totals.surveyed) %>% 
  dplyr::filter(ubiquity > quantile(medland.survey.rf.graph$ubiquity, 
                                     probs = .5)) %>% 
  group_by(study.area, period) %>% 
  summarize(area.sum = sum(area.sqm), 
            total.area.sqm = first(total.area.sqm)) %>% 
  select(study.area, period, area.sum, total.area.sqm) %>% 
  mutate(pct.coverage = area.sum/total.area.sqm) %>% 
  ungroup()  %>% 
  add_row(study.area = "Canal de Navarrés",
          period = "EPI",
          area.sum = 0,
          total.area.sqm = 4107582,
          pct.coverage = 0) %>%
  add_row(study.area = "Cocina/Catadau",
          period = "EPI",
          area.sum = 0,
          total.area.sqm = 1095683,
          pct.coverage = 0) %>%
  add_row(study.area = "Cocina/Catadau",
          period = "MESO",
          area.sum = 0,
          total.area.sqm = 1095683,
          pct.coverage = 0) %>%
  add_row(study.area = "Hoya de Buñol",
          period = "EPI",
          area.sum = 0,
          total.area.sqm = 1551377,
          pct.coverage = 0) %>% 

# Needed for upper quartile graphing   
  # add_row(study.area = "Canal de Navarrés",
  #         period = "MP",
  #         area.sum = 0,
  #         total.area.sqm = 4107582,
  #         pct.coverage = 0) %>%
  # add_row(study.area = "Canal de Navarrés",
  #         period = "MESO",
  #         area.sum = 0,
  #         total.area.sqm = 4107582,
  #         pct.coverage = 0) %>%
  # add_row(study.area = "Canal de Navarrés",
  #         period = "LNEOL",
  #         area.sum = 0,
  #         total.area.sqm = 4107582,
  #         pct.coverage = 0) %>%
  # add_row(study.area = "Cocina/Catadau",
  #         period = "MP",
  #         area.sum = 0,
  #         total.area.sqm = 1095683,
  #         pct.coverage = 0) %>%
  # add_row(study.area = "Cocina/Catadau",
  #         period = "LNEOL",
  #         area.sum = 0,
  #         total.area.sqm = 1095683,
  #         pct.coverage = 0) %>%
  # add_row(study.area = "Hoya de Buñol",
  #         period = "MP",
  #         area.sum = 0,
  #         total.area.sqm = 1551377,
  #         pct.coverage = 0) %>% 
  # add_row(study.area = "Hoya de Buñol",
  #         period = "MESO",
  #         area.sum = 0,
  #         total.area.sqm = 1551377,
  #         pct.coverage = 0) %>% 
  # add_row(study.area = "Hoya de Buñol",
  #         period = "LNEOL",
  #         area.sum = 0,
  #         total.area.sqm = 1551377,
  #         pct.coverage = 0) %>% 
  
    
  ggplot(aes(x=factor(period, levels = 
                  c('MP','UP','EPI','MESO','ENEOL','LNEOL')),
             y=pct.coverage, group=1)) + 
  geom_line(lwd=1.5) + 
  facet_wrap(~study.area, ncol = 1) + 
  labs(title='Aggregate Occupational Ubiquity', 
       subtitle='Proportion of study area surveyed\nwith ubiquity above the median', 
       x='period', 
       y='proportion') + 
  theme_bw(base_size = 16)
Joining, by = "study.area"`summarise()` has grouped output by 'study.area'. You can override using the `.groups` argument.

Figure 10b: aggregate intensity for each valley

left_join(medland.survey.rf.graph, totals.surveyed) %>% 
  mutate(intensity = ubiquity*density.km2/duration.centuries) %>% 
  dplyr::filter(intensity >= quantile(medland.survey.rf.graph$ubiquity*medland.survey.rf.graph$density.km2/medland.survey.rf.graph$duration.centuries, probs =.5)) %>% 
  group_by(study.area, period) %>% 
  summarize(area.sum = sum(area.sqm), 
            total.area.sqm = first(total.area.sqm), 
            density.km2 = first(density.km2)) %>% 
  select(study.area, period, area.sum, total.area.sqm) %>% 
  mutate(pct.coverage = area.sum/total.area.sqm) %>% 
  ungroup %>%
  add_row(study.area = "Canal de Navarrés",
          period = "MP",
          area.sum = 0,
          total.area.sqm = 4107582,
          pct.coverage = 0) %>% 
  add_row(study.area = "Hoya de Buñol",
          period = "MP",
          area.sum = 0,
          total.area.sqm = 1551377,
          pct.coverage = 0) %>% 
    
# Needed for optional upper quartile graphing
  # add_row(study.area = "Hoya de Buñol",
  #         period = "UP",
  #         area.sum = 0,
  #         total.area.sqm = 1551377,
  #         pct.coverage = 0) %>% 
      
  ggplot(aes(x=factor(period, levels = 
                  c('MP','UP','EPI','MESO','ENEOL','LNEOL')),
             y=pct.coverage, group=1)) + 
  geom_line(lwd=1.5) + 
  facet_wrap(~study.area, ncol = 1) + 
  labs(title='Aggregate Land Use Intensity', 
       subtitle='Proportion of study area surveyed\nwith intensity above the median', 
       x='period', 
       y='proportion') + 
  theme_bw(base_size = 16)
Joining, by = "study.area"`summarise()` has grouped output by 'study.area'. You can override using the `.groups` argument.

Figure 11: SPD Analyses of Prehistoric Demography

Prepare Data

Only use dates with COV ≤ 0.05

C14_SE_Iberia_all <- C14_SE_Iberia_all %>% dplyr::filter(C14.CV<0.05 & C14.SD>0)

Calibrate Dates with BChron

all.dates.calibrated <- with(C14_SE_Iberia_all, BchronCalibrate(ages = C14.mean, ageSds = C14.SD, calCurves = calib.curve, positions = site))

C14_SE_Iberia_all$BP.cal.median <- sapply(1:length(all.dates.calibrated), function(x) round(median(all.dates.calibrated[[x]]$ageGrid)))

Bin Dates

C14_SE_Iberia_all.bins <- C14_SE_Iberia_all %>% 
  with(., binPrep(site, C14.mean, 100))

Model Test

C14_SE_Iberia_all.modeltest <- C14_SE_Iberia_all %>% 
  with(., calibrate(x=C14.mean, errors=C14.SD, calCurves = calib.curve, normalised=TRUE, calMatrix=FALSE)) %>% 
  modelTest(., 
            errors = C14_SE_Iberia_all$C14.SD, 
            timeRange = c(35000,3000), 
            runm = 500, 
            model="exponential", 
            datenormalised=TRUE, 
            nsim = 200, 
            ncores = ncores,
            method = 'calsample', 
            bins = C14_SE_Iberia_all.bins)
[1] "Calibrating radiocarbon ages..."

  |                                                                                                   
  |                                                                                             |   0%
  |                                                                                                   
  |=                                                                                            |   1%
  |                                                                                                   
  |=                                                                                            |   2%
  |                                                                                                   
  |==                                                                                           |   2%
  |                                                                                                   
  |==                                                                                           |   3%
  |                                                                                                   
  |===                                                                                          |   3%
  |                                                                                                   
  |===                                                                                          |   4%
  |                                                                                                   
  |====                                                                                         |   4%
  |                                                                                                   
  |====                                                                                         |   5%
  |                                                                                                   
  |=====                                                                                        |   5%
  |                                                                                                   
  |=====                                                                                        |   6%
  |                                                                                                   
  |======                                                                                       |   6%
  |                                                                                                   
  |======                                                                                       |   7%
  |                                                                                                   
  |=======                                                                                      |   7%
  |                                                                                                   
  |=======                                                                                      |   8%
  |                                                                                                   
  |========                                                                                     |   8%
  |                                                                                                   
  |========                                                                                     |   9%
  |                                                                                                   
  |=========                                                                                    |   9%
  |                                                                                                   
  |=========                                                                                    |  10%
  |                                                                                                   
  |==========                                                                                   |  10%
  |                                                                                                   
  |==========                                                                                   |  11%
  |                                                                                                   
  |===========                                                                                  |  11%
  |                                                                                                   
  |===========                                                                                  |  12%
  |                                                                                                   
  |============                                                                                 |  12%
  |                                                                                                   
  |============                                                                                 |  13%
  |                                                                                                   
  |=============                                                                                |  13%
  |                                                                                                   
  |=============                                                                                |  14%
  |                                                                                                   
  |==============                                                                               |  15%
  |                                                                                                   
  |==============                                                                               |  16%
  |                                                                                                   
  |===============                                                                              |  16%
  |                                                                                                   
  |===============                                                                              |  17%
  |                                                                                                   
  |================                                                                             |  17%
  |                                                                                                   
  |================                                                                             |  18%
  |                                                                                                   
  |=================                                                                            |  18%
  |                                                                                                   
  |=================                                                                            |  19%
  |                                                                                                   
  |==================                                                                           |  19%
  |                                                                                                   
  |==================                                                                           |  20%
  |                                                                                                   
  |===================                                                                          |  20%
  |                                                                                                   
  |===================                                                                          |  21%
  |                                                                                                   
  |====================                                                                         |  21%
  |                                                                                                   
  |====================                                                                         |  22%
  |                                                                                                   
  |=====================                                                                        |  22%
  |                                                                                                   
  |=====================                                                                        |  23%
  |                                                                                                   
  |======================                                                                       |  23%
  |                                                                                                   
  |======================                                                                       |  24%
  |                                                                                                   
  |=======================                                                                      |  24%
  |                                                                                                   
  |=======================                                                                      |  25%
  |                                                                                                   
  |========================                                                                     |  25%
  |                                                                                                   
  |========================                                                                     |  26%
  |                                                                                                   
  |=========================                                                                    |  26%
  |                                                                                                   
  |=========================                                                                    |  27%
  |                                                                                                   
  |==========================                                                                   |  27%
  |                                                                                                   
  |==========================                                                                   |  28%
  |                                                                                                   
  |===========================                                                                  |  29%
  |                                                                                                   
  |===========================                                                                  |  30%
  |                                                                                                   
  |============================                                                                 |  30%
  |                                                                                                   
  |============================                                                                 |  31%
  |                                                                                                   
  |=============================                                                                |  31%
  |                                                                                                   
  |=============================                                                                |  32%
  |                                                                                                   
  |==============================                                                               |  32%
  |                                                                                                   
  |==============================                                                               |  33%
  |                                                                                                   
  |===============================                                                              |  33%
  |                                                                                                   
  |===============================                                                              |  34%
  |                                                                                                   
  |================================                                                             |  34%
  |                                                                                                   
  |================================                                                             |  35%
  |                                                                                                   
  |=================================                                                            |  35%
  |                                                                                                   
  |=================================                                                            |  36%
  |                                                                                                   
  |==================================                                                           |  36%
  |                                                                                                   
  |==================================                                                           |  37%
  |                                                                                                   
  |===================================                                                          |  37%
  |                                                                                                   
  |===================================                                                          |  38%
  |                                                                                                   
  |====================================                                                         |  38%
  |                                                                                                   
  |====================================                                                         |  39%
  |                                                                                                   
  |=====================================                                                        |  39%
  |                                                                                                   
  |=====================================                                                        |  40%
  |                                                                                                   
  |======================================                                                       |  40%
  |                                                                                                   
  |======================================                                                       |  41%
  |                                                                                                   
  |=======================================                                                      |  41%
  |                                                                                                   
  |=======================================                                                      |  42%
  |                                                                                                   
  |========================================                                                     |  43%
  |                                                                                                   
  |========================================                                                     |  44%
  |                                                                                                   
  |=========================================                                                    |  44%
  |                                                                                                   
  |=========================================                                                    |  45%
  |                                                                                                   
  |==========================================                                                   |  45%
  |                                                                                                   
  |==========================================                                                   |  46%
  |                                                                                                   
  |===========================================                                                  |  46%
  |                                                                                                   
  |===========================================                                                  |  47%
  |                                                                                                   
  |============================================                                                 |  47%
  |                                                                                                   
  |============================================                                                 |  48%
  |                                                                                                   
  |=============================================                                                |  48%
  |                                                                                                   
  |=============================================                                                |  49%
  |                                                                                                   
  |==============================================                                               |  49%
  |                                                                                                   
  |==============================================                                               |  50%
  |                                                                                                   
  |===============================================                                              |  50%
  |                                                                                                   
  |===============================================                                              |  51%
  |                                                                                                   
  |================================================                                             |  51%
  |                                                                                                   
  |================================================                                             |  52%
  |                                                                                                   
  |=================================================                                            |  52%
  |                                                                                                   
  |=================================================                                            |  53%
  |                                                                                                   
  |==================================================                                           |  53%
  |                                                                                                   
  |==================================================                                           |  54%
  |                                                                                                   
  |===================================================                                          |  54%
  |                                                                                                   
  |===================================================                                          |  55%
  |                                                                                                   
  |====================================================                                         |  55%
  |                                                                                                   
  |====================================================                                         |  56%
  |                                                                                                   
  |=====================================================                                        |  56%
  |                                                                                                   
  |=====================================================                                        |  57%
  |                                                                                                   
  |======================================================                                       |  58%
  |                                                                                                   
  |======================================================                                       |  59%
  |                                                                                                   
  |=======================================================                                      |  59%
  |                                                                                                   
  |=======================================================                                      |  60%
  |                                                                                                   
  |========================================================                                     |  60%
  |                                                                                                   
  |========================================================                                     |  61%
  |                                                                                                   
  |=========================================================                                    |  61%
  |                                                                                                   
  |=========================================================                                    |  62%
  |                                                                                                   
  |==========================================================                                   |  62%
  |                                                                                                   
  |==========================================================                                   |  63%
  |                                                                                                   
  |===========================================================                                  |  63%
  |                                                                                                   
  |===========================================================                                  |  64%
  |                                                                                                   
  |============================================================                                 |  64%
  |                                                                                                   
  |============================================================                                 |  65%
  |                                                                                                   
  |=============================================================                                |  65%
  |                                                                                                   
  |=============================================================                                |  66%
  |                                                                                                   
  |==============================================================                               |  66%
  |                                                                                                   
  |==============================================================                               |  67%
  |                                                                                                   
  |===============================================================                              |  67%
  |                                                                                                   
  |===============================================================                              |  68%
  |                                                                                                   
  |================================================================                             |  68%
  |                                                                                                   
  |================================================================                             |  69%
  |                                                                                                   
  |=================================================================                            |  69%
  |                                                                                                   
  |=================================================================                            |  70%
  |                                                                                                   
  |==================================================================                           |  70%
  |                                                                                                   
  |==================================================================                           |  71%
  |                                                                                                   
  |===================================================================                          |  72%
  |                                                                                                   
  |===================================================================                          |  73%
  |                                                                                                   
  |====================================================================                         |  73%
  |                                                                                                   
  |====================================================================                         |  74%
  |                                                                                                   
  |=====================================================================                        |  74%
  |                                                                                                   
  |=====================================================================                        |  75%
  |                                                                                                   
  |======================================================================                       |  75%
  |                                                                                                   
  |======================================================================                       |  76%
  |                                                                                                   
  |=======================================================================                      |  76%
  |                                                                                                   
  |=======================================================================                      |  77%
  |                                                                                                   
  |========================================================================                     |  77%
  |                                                                                                   
  |========================================================================                     |  78%
  |                                                                                                   
  |=========================================================================                    |  78%
  |                                                                                                   
  |=========================================================================                    |  79%
  |                                                                                                   
  |==========================================================================                   |  79%
  |                                                                                                   
  |==========================================================================                   |  80%
  |                                                                                                   
  |===========================================================================                  |  80%
  |                                                                                                   
  |===========================================================================                  |  81%
  |                                                                                                   
  |============================================================================                 |  81%
  |                                                                                                   
  |============================================================================                 |  82%
  |                                                                                                   
  |=============================================================================                |  82%
  |                                                                                                   
  |=============================================================================                |  83%
  |                                                                                                   
  |==============================================================================               |  83%
  |                                                                                                   
  |==============================================================================               |  84%
  |                                                                                                   
  |===============================================================================              |  84%
  |                                                                                                   
  |===============================================================================              |  85%
  |                                                                                                   
  |================================================================================             |  86%
  |                                                                                                   
  |================================================================================             |  87%
  |                                                                                                   
  |=================================================================================            |  87%
  |                                                                                                   
  |=================================================================================            |  88%
  |                                                                                                   
  |==================================================================================           |  88%
  |                                                                                                   
  |==================================================================================           |  89%
  |                                                                                                   
  |===================================================================================          |  89%
  |                                                                                                   
  |===================================================================================          |  90%
  |                                                                                                   
  |====================================================================================         |  90%
  |                                                                                                   
  |====================================================================================         |  91%
  |                                                                                                   
  |=====================================================================================        |  91%
  |                                                                                                   
  |=====================================================================================        |  92%
  |                                                                                                   
  |======================================================================================       |  92%
  |                                                                                                   
  |======================================================================================       |  93%
  |                                                                                                   
  |=======================================================================================      |  93%
  |                                                                                                   
  |=======================================================================================      |  94%
  |                                                                                                   
  |========================================================================================     |  94%
  |                                                                                                   
  |========================================================================================     |  95%
  |                                                                                                   
  |=========================================================================================    |  95%
  |                                                                                                   
  |=========================================================================================    |  96%
  |                                                                                                   
  |==========================================================================================   |  96%
  |                                                                                                   
  |==========================================================================================   |  97%
  |                                                                                                   
  |===========================================================================================  |  97%
  |                                                                                                   
  |===========================================================================================  |  98%
  |                                                                                                   
  |============================================================================================ |  98%
  |                                                                                                   
  |============================================================================================ |  99%
  |                                                                                                   
  |=============================================================================================| 100%
[1] "Done."
── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
✔ ggplot2 3.3.6     ✔ purrr   0.3.4
✔ tibble  3.1.7     ✔ dplyr   1.0.9
✔ tidyr   1.2.0     ✔ stringr 1.4.0
✔ readr   2.1.2     ✔ forcats 0.5.1


Attaching package: ‘snow’

The following objects are masked from ‘package:parallel’:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ,
    clusterExport, clusterMap, clusterSplit, makeCluster, parApply,
    parCapply, parLapply, parRapply, parSapply, splitIndices,
    stopCluster

── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
✔ ggplot2 3.3.6     ✔ purrr   0.3.4
✔ tibble  3.1.7     ✔ dplyr   1.0.9
✔ tidyr   1.2.0     ✔ stringr 1.4.0
✔ readr   2.1.2     ✔ forcats 0.5.1


Attaching package: ‘snow’

The following objects are masked from ‘package:parallel’:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ,
    clusterExport, clusterMap, clusterSplit, makeCluster, parApply,
    parCapply, parLapply, parRapply, parSapply, splitIndices,
    stopCluster

── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
✔ ggplot2 3.3.6     ✔ purrr   0.3.4
✔ tibble  3.1.7     ✔ dplyr   1.0.9
✔ tidyr   1.2.0     ✔ stringr 1.4.0
✔ readr   2.1.2     ✔ forcats 0.5.1


Attaching package: ‘snow’

The following objects are masked from ‘package:parallel’:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ,
    clusterExport, clusterMap, clusterSplit, makeCluster, parApply,
    parCapply, parLapply, parRapply, parSapply, splitIndices,
    stopCluster

── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
✔ ggplot2 3.3.6     ✔ purrr   0.3.4
✔ tibble  3.1.7     ✔ dplyr   1.0.9
✔ tidyr   1.2.0     ✔ stringr 1.4.0
✔ readr   2.1.2     ✔ forcats 0.5.1


Attaching package: ‘snow’

The following objects are masked from ‘package:parallel’:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ,
    clusterExport, clusterMap, clusterSplit, makeCluster, parApply,
    parCapply, parLapply, parRapply, parSapply, splitIndices,
    stopCluster

── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
✔ ggplot2 3.3.6     ✔ purrr   0.3.4
✔ tibble  3.1.7     ✔ dplyr   1.0.9
✔ tidyr   1.2.0     ✔ stringr 1.4.0
✔ readr   2.1.2     ✔ forcats 0.5.1


Attaching package: ‘snow’

The following objects are masked from ‘package:parallel’:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ,
    clusterExport, clusterMap, clusterSplit, makeCluster, parApply,
    parCapply, parLapply, parRapply, parSapply, splitIndices,
    stopCluster

── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
✔ ggplot2 3.3.6     ✔ purrr   0.3.4
✔ tibble  3.1.7     ✔ dplyr   1.0.9
✔ tidyr   1.2.0     ✔ stringr 1.4.0
✔ readr   2.1.2     ✔ forcats 0.5.1


Attaching package: ‘snow’

The following objects are masked from ‘package:parallel’:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ,
    clusterExport, clusterMap, clusterSplit, makeCluster, parApply,
    parCapply, parLapply, parRapply, parSapply, splitIndices,
    stopCluster

── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
✔ ggplot2 3.3.6     ✔ purrr   0.3.4
✔ tibble  3.1.7     ✔ dplyr   1.0.9
✔ tidyr   1.2.0     ✔ stringr 1.4.0
✔ readr   2.1.2     ✔ forcats 0.5.1


Attaching package: ‘snow’

The following objects are masked from ‘package:parallel’:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ,
    clusterExport, clusterMap, clusterSplit, makeCluster, parApply,
    parCapply, parLapply, parRapply, parSapply, splitIndices,
    stopCluster

── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
✔ ggplot2 3.3.6     ✔ purrr   0.3.4
✔ tibble  3.1.7     ✔ dplyr   1.0.9
✔ tidyr   1.2.0     ✔ stringr 1.4.0
✔ readr   2.1.2     ✔ forcats 0.5.1


Attaching package: ‘snow’

The following objects are masked from ‘package:parallel’:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ,
    clusterExport, clusterMap, clusterSplit, makeCluster, parApply,
    parCapply, parLapply, parRapply, parSapply, splitIndices,
    stopCluster
[1] "Aggregating observed dates..."
[1] "Monte-Carlo test..."

Plot SPD

par(mar=c(7,7,7,3))
plot(C14_SE_Iberia_all.modeltest, xlim = c(30000,4000), col.obs = 'black', lwd.obs = 5, drawaxes = F)
axis(1, cex.axis = 2, pos = -.01, at=(seq(30000,0, by=-5000)))
axis(2, cex.axis = 2, pos = 30200)
mtext(side=1, line=5, "calibrated years BP", cex=2.5)
mtext(side=2, line=4, "summed probability density", cex=2.5)
title(main=paste("Southern and Eastern Iberia SPD (N = ", nrow(C14_SE_Iberia_all), ")\n"), cex.main = 3)

LS0tCnRpdGxlOiAiQSBNdWx0aS1tZXRob2QgQXBwcm9hY2ggd2l0aCBNYWNoaW5lIExlYXJuaW5nIHRvIEV2YWx1YXRpbmcgdGhlIERpc3RyaWJ1dGlvbiBhbmQgSW50ZW5zaXR5IG9mIFByZWhpc3RvcmljIExhbmQgVXNlIGluIEVhc3Rlcm4gSWJlcmlhIgpzdWJ0aXRsZTogIlIgTWFya2Rvd24gU2NyaXB0cyBmb3IgUmVwcm9kdWNpbmcgQW5hbHlzZXMiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiAKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKCiMjIEdldCBhbGwgdGhlIHBhY2thZ2VzIHJlYWR5CgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3RleHQpCmxpYnJhcnkodGlkeW1vZGVscykKbGlicmFyeShjYXJldCkKbGlicmFyeShyYW5nZXIpCmxpYnJhcnkodGhlbWlzKQpsaWJyYXJ5KHZpcCkKbGlicmFyeShyZWFkcikKbGlicmFyeShyY2FyYm9uKQpsaWJyYXJ5KEJjaHJvbikKbGlicmFyeShkb1BhcmFsbGVsKQpsaWJyYXJ5KHBhcmFsbGVsKQoKbmNvcmVzIDwtIG1heCgxTCwgZGV0ZWN0Q29yZXMoKSwgbmEucm0gPSBUUlVFKQpvcHRpb25zKE5jcHVzID0gbmNvcmVzKQpgYGAKCgojIyBMb2FkIGRhdGEKCmBgYHtyIGxvYWQgTWVkbGFuZCBkYXRhfQojIExvYWQgTWVkbGFuZCBzdXJ2ZXkgY29sbGVjdGlvbiBkYXRhCm1lZGxhbmRfc3VydmV5MjAxNF8yMDE3IDwtIHJlYWRfY3N2KCJkYXRhL21lZGxhbmRfc3VydmV5MjAxNF8yMDE3LmNzdiIpCgojIExvYWQgdHJhaW5pbmcgZGF0YSBmb3IgUmFuZG9tIEZvcmVzdCBtb2RlbGluZwp0cmFpbmluZ19kYXRhX0VfSWJlcmlhIDwtIHJlYWRfY3N2KCJkYXRhL3RyYWluaW5nX2RhdGFfRV9JYmVyaWEuY3N2IiwgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gIklTTy04ODU5LTEiKSkKCiMgTG9hZCBDMTQgZGF0YSBmb3IgU1BEIGFuYWx5c2lzCkMxNF9TRV9JYmVyaWFfYWxsIDwtIHJlYWRfY3N2KCJkYXRhL0MxNF9TJkVfSWJlcmlhX2FsbC5jc3YiLCBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAiODUwIikpCgpgYGAKCgojIEZpZ3VyZXMgMSBhbmQgMiBnZW5lcmF0ZWQgaW4gR0lTIHNvZnR3YXJlCgojIEZpZ3VyZSAzOiBTdXJmYWNlIFZpc2liaWxpdHkgYW5kIEFydGlmYWN0IFJlY292ZXJ5CgpgYGB7ciBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02fQptZWRsYW5kX3N1cnZleTIwMTRfMjAxNyAlPiUgCiAgZHBseXI6OmZpbHRlcihhcmVhLnNxbT4wICYgdG90YWwubGl0aGljcz4wICYgIWlzLm5hKHZpc2liaWxpdHkpKSAlPiUgCiAgbXV0YXRlKGxpdGhpYy5kZW5zaXR5PXRvdGFsLmxpdGhpY3MvYXJlYS5zcW0pICU+JSAKICBnZ3Bsb3QoYWVzKHg9bGl0aGljLmRlbnNpdHkpLCB4bGltPS4wMikgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IC4wMDEpICsgCiAgc2NhbGVfeV9sb2cxMCgpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwwLjAxKSwgYnJlYWtzID0gYygwLC4wMDIsIC4wMDQsIC4wMDYsIC4wMDgpKSArIAogIGxhYnModGl0bGUgPSAiU3VyZmFjZSBWaXNpYmlsaXR5IGFuZCBBcnRpZmFjdCBSZWNvdmVyeSIsCiAgICAgICB4PSJsaXRoaWMgYXJ0aWZhY3RzIC8ga21eMiIsCiAgICAgICB5PSdjb3VudCBvZiBwYXRjaGVzJykgKyAKICBmYWNldF9ncmlkKGZhY3Rvcih2aXNpYmlsaXR5KX5zdHVkeS5hcmVhKSArIAogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDIwKSArIAogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfbWFya2Rvd24oKSkKYGBgCgojIyMgQU5PVkEgZm9yIEZpZ3VyZSAzOiBhbGwgc3VydmV5IGFyZWFzIGFuZCBlYWNoIHN1cnZleSBhcmVhCgpgYGB7cn0KY2F0KCJcbkNhbmFsIGRlIE5hdmFycsOpcyBzdXJ2ZXkgYXJlYVxuIikKd2l0aChtZWRsYW5kX3N1cnZleTIwMTRfMjAxNyAlPiUgCiAgICAgICBkcGx5cjo6ZmlsdGVyKHRvdGFsLmxpdGhpY3M+MCAmICFpcy5uYSh2aXNpYmlsaXR5KSAmIHN0dWR5LmFyZWEgPT0gIkNhbmFsIGRlIE5hdmFycsOpcyIpICU+JSAKICAgICAgIG11dGF0ZShsaXRoaWMuZGVuc2l0eT10b3RhbC5saXRoaWNzL2FyZWEuc3FtKSwgCiAgYW92KGxpdGhpYy5kZW5zaXR5fnZpc2liaWxpdHkpKSAlPiUgc3VtbWFyeSgpCgpjYXQoIlxuSG95YSBkZSBCdcOxb2wgc3VydmV5IGFyZWFcbiIpCndpdGgobWVkbGFuZF9zdXJ2ZXkyMDE0XzIwMTcgJT4lIAogICAgICAgZHBseXI6OmZpbHRlcih0b3RhbC5saXRoaWNzPjAgJiAhaXMubmEodmlzaWJpbGl0eSkgJiBzdHVkeS5hcmVhID09ICJIb3lhIGRlIEJ1w7FvbCIpICU+JSAKICAgICAgIG11dGF0ZShsaXRoaWMuZGVuc2l0eT10b3RhbC5saXRoaWNzL2FyZWEuc3FtKSwgCiAgYW92KGxpdGhpYy5kZW5zaXR5fnZpc2liaWxpdHkpKSAlPiUgc3VtbWFyeSgpCgpjYXQoIlxuQ29jaW5hL0NhdGFkYXUgc3VydmV5IGFyZWFcbiIpCndpdGgobWVkbGFuZF9zdXJ2ZXkyMDE0XzIwMTcgJT4lIAogICAgICAgZHBseXI6OmZpbHRlcih0b3RhbC5saXRoaWNzPjAgJiAhaXMubmEodmlzaWJpbGl0eSkgJiBzdHVkeS5hcmVhID09ICJDb2NpbmEvQ2F0YWRhdSIpICU+JSAKICAgICAgIG11dGF0ZShsaXRoaWMuZGVuc2l0eT10b3RhbC5saXRoaWNzL2FyZWEuc3FtKSwgCiAgYW92KGxpdGhpYy5kZW5zaXR5fnZpc2liaWxpdHkpKSAlPiUgc3VtbWFyeSgpCmBgYAoKCiMgUmFuZG9tIEZvcmVzdCBNb2RlbCBmb3IgQ2hyb25vbG9naWNhbCBVbm1peGluZyAoRmlndXJlIDQgYW5kIFRhYmxlIDQpCgojIyBEYXRhIHByZXBhcmF0aW9uCgojIyMgUHJlcGFyZSBkYXRhIGZvciBWYWxlbmNpYSBkYXRlZCBhc3NlbWJsYWdlcwoKYGBge3IgcHJlcGFyZSB0cmFpbmluZyBkYXRhfQoKCiMgTW9kaWZ5IHRyYWluaW5nIGRhdGEgYmFzZWQgb24gTUwgYW5kIEJheWVzaWFuIHRlc3Rpbmc6IAojICBNZXJnZSBFTkVPTCBhbmQgTU5FT0wKIyAgUmVtb3ZlIHVuZGlhZ25vc3RpYyBsaXRoaWNzIGZvciBhZ2UgZXN0aW1hdGVzCiMgIFNvcnQgZmFjdG9yIGxldmVscyBjaHJvbm9sb2dpY2FsbHkgCgp0cmFpbmluZ19kYXRhX0VfSWJlcmlhIDwtIHRyYWluaW5nX2RhdGFfRV9JYmVyaWEgJT4lIAogIHNlbGVjdCgtdW5kaWFnLmxpdGhpY3MsIC10b3RhbC5saXRoaWNzLCAtY2l0YXRpb24pICU+JSAKICBtdXRhdGUocGVyaW9kID0gcmVwbGFjZShwZXJpb2QsIHBlcmlvZCA9PSAiTU5FT0wiLCAiRU5FT0wiKSwgCiAgICAgICAgIHBlcmlvZCA9IGZhY3RvcihwZXJpb2QsCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJNUCIsICJVUCIsICJFUEkiLCAiTUVTTyIsICJFTkVPTCIsICJMTkVPTCIpKSkKYGBgCgoKIyMjIFByZXBhcmUgZGF0YSBmcm9tIHN1cnZleSBjb2xsZWN0aW9ucyBmb3IgYXBwbHlpbmcgUmFuZG9tIEZvcmVzdCBtb2RlbApgYGB7ciBwcmVwYXJlIE1lZGxhbmQgZGF0YX0KIyBmaWx0ZXIgb3V0IGFzc2VtYmxhZ2VzIHdpdGggb25seSB1bmRpYWdub3N0aWMgbGl0aGljcwptZWRsYW5kX3N1cnZleTIwMTRfMjAxN19saXRoaWNzIDwtIG1lZGxhbmRfc3VydmV5MjAxNF8yMDE3ICU+JSAKICBkcGx5cjo6ZmlsdGVyKHVuZGlhZy5saXRoaWNzIDwgdG90YWwubGl0aGljcykgJT4lIAogIHNlbGVjdChJRCwgYygxMzoyNykpCgojIG1ha2Ugc2VwYXJhdGUgdGFibGUgb2YgYXNzZW1ibGFnZSBJRCBhbmQgcHJvdmVuaWVuY2UKbWVkbGFuZF9zdXJ2ZXkyMDE0XzIwMTdfaW5mbyA8LSBtZWRsYW5kX3N1cnZleTIwMTRfMjAxNyAlPiUgCiAgZHBseXI6OmZpbHRlcih1bmRpYWcubGl0aGljcyA8IHRvdGFsLmxpdGhpY3MpICU+JSAKICBtdXRhdGUoYXNzZW1ibGFnZSA9IHBhc3RlKHN0dWR5LmFyZWEsICItIiwgem9uZSwgIi0iLCBzZWN0b3IsICItIiwgc3Vic2VjdG9yLCBzZXAgPSAiIikpICU+JSAKICBzZWxlY3QoSUQsIHN0dWR5LmFyZWEsIGFzc2VtYmxhZ2UpCgojIGNhbGN1bGF0ZSBsaXRoaWMgZGVuc2l0eSBmb3IgZWFjaCBjb2xsZWN0aW9uIHBhdGNoCm1lZGxhbmRfc3VydmV5MjAxNF8yMDE3X2RlbnNpdHkgPC0gbWVkbGFuZF9zdXJ2ZXkyMDE0XzIwMTcgJT4lIAogIGRwbHlyOjpmaWx0ZXIodW5kaWFnLmxpdGhpY3MgPCB0b3RhbC5saXRoaWNzKSAlPiUgCiAgbXV0YXRlKGFzc2VtYmxhZ2UgPSBwYXN0ZShzdHVkeS5hcmVhLCAiLSIsIHpvbmUsICItIiwgc2VjdG9yLCAiLSIsIHN1YnNlY3Rvciwgc2VwID0gIiIpLCAKICAgICAgICAgZGVuc2l0eS5rbTIgPSB0b3RhbC5saXRoaWNzKjEwMDAvYXJlYS5zcW0pJT4lIAogIHNlbGVjdChJRCwgdG90YWwubGl0aGljcywgYXJlYS5zcW0sZGVuc2l0eS5rbTIpCmBgYAoKIyMjIFNwbGl0IGRhdGEgaW50byB0cmFpbmluZyBhbmQgdGVzdCBzZXRzCgpgYGB7ciBzcGxpdCB0cmFpbmluZyAmIHRlc3QgZGF0YX0KIyBQYXJ0aXRpb24gaW50byB0cmFpbmluZyBhbmQgaG9sZCBvdXQgdGVzdCAvIHZhbGlkYXRpb24gc2FtcGxlCnNldC5zZWVkKDQ1NikgIyMgaWYgd2Ugd2FudCB0byBtYWtlIGl0IGNvbXBsZXRlbHkgcmVwcm9kdWNpYmxlCnZsLnNwbGl0IDwtIHRyYWluaW5nX2RhdGFfRV9JYmVyaWEgJT4lIAogIHJzYW1wbGU6OmluaXRpYWxfc3BsaXQoLiwgcHJvcD0uNzUpCgp2bC50cmFpbiA8LSByc2FtcGxlOjp0cmFpbmluZyh2bC5zcGxpdCkKdmwudGVzdCA8LSByc2FtcGxlOjp0ZXN0aW5nKHZsLnNwbGl0KQoKIyBzYXZlIElEIGRhdGEgZm9yIGxhdGVyIGFuYWx5c2lzCnZsLnRlc3QuaWQgPC0gdmwudGVzdCAlPiUgCiAgc2VsZWN0KElELCBwZXJpb2QpCgpgYGAKCgojIyMgY3JlYXRlIHYtZm9sZCBvYmplY3RzIGZvciByZXBsaWNhYmxlIGFuZCBjb21wYXJhYmxlIGNyb3NzLXZhbGlkYXRpb24KCjEwIGZvbGRzIHVzaW5nIGFsbCB0aGUgdHJhaW5pbmcgZGF0YQpgYGB7ciB2Zm9sZDEwIGFsbH0Kc2V0LnNlZWQoNDU2KQp2ZjEwLmFsbCA8LSB2Zm9sZF9jdih0cmFpbmluZ19kYXRhX0VfSWJlcmlhICU+JSBzZWxlY3QoLUlEKSx2PTEwKQpgYGAKCjEwIGZvbGRzIHVzaW5nIHRoZSA3NSUgdHJhaW5pbmcgZGF0YSBzcGxpdApgYGB7ciB2Zm9sZDEwIHRyYWlufQpzZXQuc2VlZCg0NTYpCnZmMTAudHJhaW4gPC0gdmZvbGRfY3YodmwudHJhaW4gJT4lIHNlbGVjdCgtSUQpLHY9MTApCmBgYAoKCiMjIFRlc3QgUmFuZG9tIEZvcmVzdCBNb2RlbCBmb3IgRXN0aW1hdGluZyBBZ2Ugb2YgU3VyZmFjZSBBc3NlbWJsYWdlcwoKIyMjIENyZWF0ZSBhbmQgZXZhbHVhdGUgUkYgbW9kZWwgdXNpbmcgYSA3NSUgc3BsaXQgKHZsLnNwbGl0KQoKIyMjIyBEZWZpbmUgYW5kIGluc3RhbnRpYXRlIGEgcmFuZG9tIGZvcmVzdCBtb2RlbAoKYGBge3IgUkYgZGVmaW5lIG1vZGVsfQp2YWxlbmNpYS5saXRoaWNzLnJmLm1vZCA8LSAKICByYW5kX2ZvcmVzdCh0cmVlcz01MDApICU+JSAKICBzZXRfZW5naW5lKCJyYW5nZXIiLCBpbXBvcnRhbmNlID0gImltcHVyaXR5IikgJT4lIAogIHNldF9tb2RlKCJjbGFzc2lmaWNhdGlvbiIpCgpwcmludCh2YWxlbmNpYS5saXRoaWNzLnJmLm1vZCkKYGBgCgojIyMjIEZpdCB0aGUgbW9kZWwgdG8gdGhlIHRyYWluaW5nIGRhdGEKCmBgYHtyIFJGIGZpdCBtb2RlbH0KdmFsZW5jaWEubGl0aGljcy5yZi5maXQgPC0gCiAgdmFsZW5jaWEubGl0aGljcy5yZi5tb2QgJT4lIAogIGZpdChhcy5mYWN0b3IocGVyaW9kKSB+IC4sIGRhdGEgPSB2bC50cmFpblssMjpuY29sKHZsLnRyYWluKV0pCgpwcmludCh2YWxlbmNpYS5saXRoaWNzLnJmLmZpdCkKYGBgCgojIyMjIE9wdGlvbmFsIGdyYXBoOiB2YXJpYWJsZSBpbXBvcnRhbmNlIGZvciByYW5kb20gZm9yZXN0IG1vZGVsIHdpdGggdHJhaW5pbmcgc2V0CgpgYGB7cn0KdmFsZW5jaWEubGl0aGljcy5yZi5maXQgJT4lIAogIGV4dHJhY3RfZml0X2VuZ2luZSgpICU+JSAKICB2aXAoYWVzdGhldGljcyA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBmaWxsID0gIiMyNkFDQjUiKSwgbnVtX2ZlYXR1cmVzID0gMTUpICsgdGhlbWVfbWluaW1hbCgpCmBgYAoKIyMjIyBFeHRyYWN0IHRoZSBmaXR0ZWQgZGF0YSAKCmBgYHtyIFJGIGV4dHJhY3QgbW9kZWwgZml0fQp2YWxlbmNpYS5saXRoaWNzLnJmLnByZWRpY3RlZCA8LSAKICB2YWxlbmNpYS5saXRoaWNzLnJmLmZpdCAlPiUgCiAgcHJlZGljdCh2bC50ZXN0KSAlPiUgCiAgYmluZF9jb2xzKHZsLnRlc3QuaWRbMToyXSwgLiwgcHJlZGljdCh2YWxlbmNpYS5saXRoaWNzLnJmLmZpdCwgdmwudGVzdCwgdHlwZT0icHJvYiIpKSAlPiUgCiAgcmVuYW1lKHByZWRpY3RlZC5hZ2UgPSAucHJlZF9jbGFzcywgCiAgICAgICAgIE1QPS5wcmVkX01QLAogICAgICAgICBVUD0ucHJlZF9VUCwKICAgICAgICAgRVBJPS5wcmVkX0VQSSwgCiAgICAgICAgIE1FU089LnByZWRfTUVTTywgCiAgICAgICAgIEVORU9MPS5wcmVkX0VORU9MLCAKICAgICAgICAgTE5FT0w9LnByZWRfTE5FT0wsIAogICAgICAgICB0cnVlLmFnZSA9IHBlcmlvZCkgJT4lIAogIG11dGF0ZSh0cnVlLmFnZSA9IGZhY3Rvcih0cnVlLmFnZSwgCiAgICAgICAgICAgbGV2ZWxzPWMoIk1QIiwgIlVQIiwgIkVQSSIsICJNRVNPIiwgIkVORU9MIiwgIkxORU9MIikpLAogICAgICAgICBwcmVkaWN0ZWQuYWdlID0gZmFjdG9yKHByZWRpY3RlZC5hZ2UsIAogICAgICAgICAgIGxldmVscz1jKCJNUCIsICJVUCIsICJFUEkiLCAiTUVTTyIsICJFTkVPTCIsICJMTkVPTCIpKSkKCnByaW50KHZhbGVuY2lhLmxpdGhpY3MucmYucHJlZGljdGVkKQpgYGAKCiMjIyMgRmlndXJlIDQ6IEdyYXBoIHJhbmRvbSBmb3Jlc3QgcHJlZGljdGlvbnMgZm9yIHRlc3Qgc2V0CgpgYGB7ciBSRiBncmFwaCBwcmVkaWN0aW9ucywgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0KdmFsZW5jaWEubGl0aGljcy5yZi5wcmVkaWN0ZWQgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gNDpuY29sKHZhbGVuY2lhLmxpdGhpY3MucmYucHJlZGljdGVkKSwgCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInBlcmlvZCIsIHZhbHVlc190byA9ICJwcm9iYWJpbGl0eSIpICU+JSAKICBtdXRhdGUocGVyaW9kID0gZmFjdG9yKHBlcmlvZCwgCiAgICAgIGxldmVscyA9IGMoIk1QIiwgIlVQIiwgIkVQSSIsICJNRVNPIiwgIkVORU9MIiwgIkxORU9MIikpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9cGVyaW9kLCB5PXByb2JhYmlsaXR5KSkgKyAKICBnZW9tX2xpbmUoZ3JvdXA9MSkgKyAKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gdHJ1ZS5hZ2UpLCBjb2xvcj0icmVkIiwgc2l6ZT0yLCBhbHBoYT0uNSkgKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBwcmVkaWN0ZWQuYWdlKSwgY29sb3I9ImJsdWUiLCBzaXplPTAuOCkgKyAKICBsYWJzKHRpdGxlPSJSYW5kb20gRm9yZXN0IFByZWRpY3Rpb25zIGZvciBFYWNoIEFzc2VtYmxhZ2UiLCAKICAgICAgIHN1YnRpdGxlPSJibGFjayBsaW5lIGluZGljYXRlcyBwcm9iYWJpbGl0eSwgYmx1ZSBsaW5lIGluZGljYXRlcyBwcmVkaWN0ZWQgYWdlLCAmIHJlZCBsaW5lIGluZGljYXRlcyBrbm93biBhZ2UiLAogICAgICAgeD0idGltZSBwZXJpb2QiLAogICAgICAgeT0icHJvYmFiaWxpdHkgb2YgcHJlZGljdGVkIHRpbWUgcGVyaW9kIikgKyAKICBmYWNldF93cmFwKHZhcnMoSUQpLCBuY29sID0gNykgKyAKICB0aGVtZV9idyhiYXNlX3NpemUgPSAyMCkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IDEsIGhqdXN0PTEpLCAKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKYGBgCgojIyMjIENyZWF0ZSBjb25mdXNpb24gbWF0cml4IGZvciA3NSUgdHJhaW5pbmcvdGVzdCBzcGxpdAoKYGBge3IgUkYgY29uZnVzaW9uIG1hdHJpeCAxfQpsaWJyYXJ5KGNhcmV0KQp3aXRoKHZhbGVuY2lhLmxpdGhpY3MucmYucHJlZGljdGVkLCAgCiAgY2FyZXQ6OmNvbmZ1c2lvbk1hdHJpeCh0cnVlLmFnZSwgcHJlZGljdGVkLmFnZSkpCmBgYAoKIyMjIENyZWF0ZSBhbmQgZXZhbHVhdGUgY3Jvc3MtdmFsaWRhdGVkIHJhbmRvbSBmb3Jlc3QgbW9kZWwgdXNpbmcgMTAgZm9sZHMKCiMjIyMgRGVmaW5lIGFuZCBpbnN0YW50aWF0ZSBhIHJhbmRvbSBmb3Jlc3QgbW9kZWwgd29ya2Zsb3cgYW5kIGZpdCB0byBjcm9zcy12YWxpZGF0ZWQgZGF0YSBzZXQKCmBgYHtyIFJGIHh2YWxpZGF0ZSBmaXQgbW9kZWx9CiNDcmVhdGUgd29ya2Zsb3cgc3RlcAp2YWxlbmNpYS5saXRoaWNzLnJmLndmIDwtIAogIHdvcmtmbG93KCkgJT4lIAogIGFkZF9tb2RlbCh2YWxlbmNpYS5saXRoaWNzLnJmLm1vZCkgJT4lIAogIGFkZF9mb3JtdWxhKHBlcmlvZCB+IC4pICNUaGUgcHJlZGljdG9yIGlzIGNvbnRhaW5lZCBpbiBhZGRfZm9ybXVsYSBtZXRob2QKCnNldC5zZWVkKDQ1NikgIyBGb3IgcmVwcm9kdWNpYmlsaXR5CnZhbGVuY2lhLmxpdGhpY3MucmYueHYuZml0IDwtIAogIHZhbGVuY2lhLmxpdGhpY3MucmYud2YgJT4lIAogIGZpdF9yZXNhbXBsZXModmYxMC5hbGwsCiAgICAgICAgICAgICAgICBjb250cm9sPWNvbnRyb2xfcmVzYW1wbGVzKHNhdmVfcHJlZCA9IFRSVUUpKQoKcHJpbnQodmFsZW5jaWEubGl0aGljcy5yZi54di5maXQpCmBgYAoKCiMjIyMgQ29sbGVjdCB0aGUgY3Jvc3MtdmFsaWRhdGVkIG1ldHJpY3MKCmBgYHtyIFJGIHh2YWxpZGF0ZSBjb2xsZWN0IG1ldHJpY3N9CiMgQ29sbGVjdCB0aGUgbWV0cmljcyB1c2luZyBhbm90aGVyIG1vZGVsIHdpdGggY3Jvc3MtdmFsaWRhdGlvbgp2YWxlbmNpYS5saXRoaWNzLnJmLnh2Lm1lYW5wcmVkcyA8LSB0dW5lOjpjb2xsZWN0X21ldHJpY3ModmFsZW5jaWEubGl0aGljcy5yZi54di5maXQpCnByaW50KHZhbGVuY2lhLmxpdGhpY3MucmYueHYubWVhbnByZWRzKQpgYGAKCgojIyMjIE9wdGlvbmFsIEdyYXBoOiB2YXJpYWJsZSBpbXBvcnRhbmNlIGZvciBjcm9zcy12YWxpZGF0ZWQgcmFuZG9tIGZvcmVzdCBtb2RlbAoKYGBge3IgUkYgVklQIGFsbH0KdmFsZW5jaWEubGl0aGljcy5yZi5tb2QgJT4lIAogIGZpdChhcy5mYWN0b3IocGVyaW9kKSB+IC4sIGRhdGEgPSB0cmFpbmluZ19kYXRhX0VfSWJlcmlhWywyOm5jb2wodHJhaW5pbmdfZGF0YV9FX0liZXJpYSldKSAlPiUgCiAgZXh0cmFjdF9maXRfZW5naW5lKCkgJT4lIAogIHZpcChhZXN0aGV0aWNzID0gbGlzdChjb2xvciA9ICJibGFjayIsIGZpbGwgPSAiIzI2QUNCNSIpLCBudW1fZmVhdHVyZXMgPSAxNSkgKyAKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKIyMjIyBFeHRyYWN0IHByZWRpY3Rpb25zIG9mIHJhbmRvbSBmb3Jlc3QgbW9kZWwgd2l0aCBjcm9zcy12YWxpZGF0aW9uCgpgYGB7ciBSRiB4dmFsaWRhdGUgcHJlZGljdGlvbnN9CnZhbGVuY2lhLmxpdGhpY3MucmYueHYucHJlZGljdGlvbnMgPC0gY29sbGVjdF9wcmVkaWN0aW9ucyh2YWxlbmNpYS5saXRoaWNzLnJmLnh2LmZpdCwgc3VtbWFyaXplID0gVFJVRSkgJT4lIAogIGFycmFuZ2UoLnJvdykgJT4lIAogIHJlbmFtZShwcmVkaWN0ZWQuYWdlID0gLnByZWRfY2xhc3MsCiAgICAgICAgIE1QPS5wcmVkX01QLAogICAgICAgICBVUD0ucHJlZF9VUCwKICAgICAgICAgRVBJPS5wcmVkX0VQSSwgCiAgICAgICAgIE1FU089LnByZWRfTUVTTywgCiAgICAgICAgIEVORU9MPS5wcmVkX0VORU9MLCAKICAgICAgICAgTE5FT0w9LnByZWRfTE5FT0wsCiAgICAgICAgIHRydWUuYWdlPXBlcmlvZCkgJT4lIAogIHNlbGVjdCgtLnJvdywgLS5jb25maWcpICU+JSAKICByZWxvY2F0ZShwcmVkaWN0ZWQuYWdlLCAuYWZ0ZXIgPSB0cnVlLmFnZSkgJT4lIAogIGJpbmRfY29scyh0cmFpbmluZ19kYXRhX0VfSWJlcmlhWzFdLCAuKQoKcHJpbnQodmFsZW5jaWEubGl0aGljcy5yZi54di5wcmVkaWN0aW9ucykKYGBgCgoKIyMjIyBPcHRpb25hbCBHcmFwaDogcmVzdWx0cyBmb3IgY3Jvc3MtdmFsaWRhdGVkIHJhbmRvbSBmb3Jlc3QgcHJlZGljdGlvbnMKCmBgYHtyIFJGIHh2YWxpZGF0ZSBncmFwaCBwcmVkaWN0aW9ucywgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTE0fQp2YWxlbmNpYS5saXRoaWNzLnJmLnh2LnByZWRpY3Rpb25zICU+JSAKICBwaXZvdF9sb25nZXIoY29scyA9IDQ6bmNvbCh2YWxlbmNpYS5saXRoaWNzLnJmLnh2LnByZWRpY3Rpb25zKSwgbmFtZXNfdG8gPSAicGVyaW9kIiwgdmFsdWVzX3RvID0gInByb2JhYmlsaXR5IikgJT4lIAogIG11dGF0ZShwZXJpb2QgPSBmYWN0b3IocGVyaW9kLCBsZXZlbHMgPSBjKCJNUCIsIlVQIiwiRVBJIiwiTUVTTyIsIkVORU9MIiwiTU5FT0wiLCJMTkVPTCIpKSkgJT4lIApnZ3Bsb3QoYWVzKHg9cGVyaW9kLCB5PXByb2JhYmlsaXR5KSkgKyAKICBnZW9tX2xpbmUoZ3JvdXA9MSkgKyAKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gdHJ1ZS5hZ2UpLCBjb2xvcj0icmVkIiwgc2l6ZT0yLCBhbHBoYT0uNSkgKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBwcmVkaWN0ZWQuYWdlKSwgY29sb3I9ImJsdWUiLCBzaXplPTAuOCkgKyAKICBsYWJzKHRpdGxlPSJSYW5kb20gRm9yZXN0IHdpdGggQ3Jvc3MtVmFsaWRhdGVkIFByZWRpY3Rpb25zIiwgCiAgICAgICBzdWJ0aXRsZT0iVGltZSBQZXJpb2RzIGZvciBFYWNoIEFzc2VtYmxhZ2UiLAogICAgICAgeD0icHJlZGljdGVkIHRpbWUgcGVyaW9kXG4oYmx1ZSBsaW5lIGluZGljYXRlcyBwcmVkaWN0aW9uICYgcmVkIGxpbmUgaW5kaWNhdGVzIHJhZGlvY2FyYm9uIGFnZSkiKSArCiAgZmFjZXRfd3JhcCh2YXJzKElEKSkgKyAKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IDEsIGhqdXN0PTEpKQoKYGBgCgoKIyMjIyBUYWJsZSA0OiBDb25mdXNpb24gbWF0cml4IGZvciBjcm9zcy12YWxpZGF0ZWQgcmFuZG9tIGZvcmVzdCBwcmVkaWN0aW9ucwoKYGBge3IgUkYgeHZhbGlkYXRlIGNvbmZ1c2lvbiBtYXRyaXh9CmNhcmV0Ojpjb25mdXNpb25NYXRyaXgoCiAgYXMuZmFjdG9yKHZhbGVuY2lhLmxpdGhpY3MucmYueHYucHJlZGljdGlvbnMkdHJ1ZS5hZ2UpLAogIGFzLmZhY3Rvcih2YWxlbmNpYS5saXRoaWNzLnJmLnh2LnByZWRpY3Rpb25zJHByZWRpY3RlZC5hZ2UpKQpgYGAKCgojIyBDcmVhdGUgcmFuZG9tIGZvcmVzdCBtb2RlbCBmcm9tIGFsbCB0cmFpbmluZyBkYXRhIHRvIGVzdGltYXRlIGFnZXMgb2Ygc3VyZmFjZSBjb2xsZWN0aW9ucyBmcm9tIHN1cnZleQoKIyMjIERlZmluZSBhbmQgaW5zdGFudGlhdGUgYSBSYW5kb20gRm9yZXN0IG1vZGVsIHVzaW5nIGFsbCB0aGUga25vd24gdHJhaW5pbmcgZGF0YQoKYGBge3IgTWVkbGFuZCBSRiBkZWZpbmUgbW9kZWx9Cm1lZGxhbmQuc3VydmV5LnJmLm1vZCA8LSAKICByYW5kX2ZvcmVzdCh0cmVlcz01MDApICU+JSAKICBzZXRfZW5naW5lKCJyYW5nZXIiKSAlPiUgCiAgc2V0X21vZGUoImNsYXNzaWZpY2F0aW9uIikKCnByaW50KG1lZGxhbmQuc3VydmV5LnJmLm1vZCkKYGBgCgojIyMgRXh0cmFjdCBmaXQgb2YgUmFuZG9tIEZvcmVzdCBtb2RlbAoKYGBge3IgTWVkbGFuZCBSRiBmaXQgbW9kZWx9Cm1lZGxhbmQuc3VydmV5LnJmLmZpdCA8LSAKICBtZWRsYW5kLnN1cnZleS5yZi5tb2QgJT4lIAogIGZpdChhcy5mYWN0b3IocGVyaW9kKSB+IC4sIGRhdGEgPSB0cmFpbmluZ19kYXRhX0VfSWJlcmlhWywyOm5jb2wodHJhaW5pbmdfZGF0YV9FX0liZXJpYSldKQoKcHJpbnQobWVkbGFuZC5zdXJ2ZXkucmYuZml0KQpgYGAKCiMjIyBBcHBseSBSYW5kb20gRm9yZXN0IG1vZGVsIHRvIHN1cmZhY2UgY29sbGVjdGlvbnMgYW5kIGdlbmVyYXRlIGFnZSBlc3RpbWF0ZSBwcmVkaWN0aW9ucyBmb3IgZWFjaCBjb2xsZWN0aW9uCgpgYGB7ciBNZWRsYW5kIFJGIGV4dHJhY3QgbW9kZWwgZml0fQptZWRsYW5kLnN1cnZleS5yZi5wcmVkaWN0ZWQgPC0gCiAgbWVkbGFuZC5zdXJ2ZXkucmYuZml0ICU+JSAKICBwcmVkaWN0KG1lZGxhbmRfc3VydmV5MjAxNF8yMDE3X2xpdGhpY3MpICU+JSAKICBiaW5kX2NvbHMobWVkbGFuZF9zdXJ2ZXkyMDE0XzIwMTdfaW5mbywgLiwgCiAgICAgICAgICAgIHByZWRpY3QobWVkbGFuZC5zdXJ2ZXkucmYuZml0LCBtZWRsYW5kX3N1cnZleTIwMTRfMjAxN19saXRoaWNzLCB0eXBlPSJwcm9iIikpICU+JSAKICByZW5hbWUocHJlZGljdGVkLnBlcmlvZCA9IC5wcmVkX2NsYXNzLCAKICAgICAgICAgTVA9LnByZWRfTVAsCiAgICAgICAgIFVQPS5wcmVkX1VQLAogICAgICAgICBFUEk9LnByZWRfRVBJLCAKICAgICAgICAgTUVTTz0ucHJlZF9NRVNPLCAKICAgICAgICAgRU5FT0w9LnByZWRfRU5FT0wsIAogICAgICAgICBMTkVPTD0ucHJlZF9MTkVPTCkgJT4lIAogIG11dGF0ZShwcmVkaWN0ZWQucGVyaW9kID0gZmFjdG9yKHByZWRpY3RlZC5wZXJpb2QsIAogICAgICAgICAgIGxldmVscz1jKCJNUCIsICJVUCIsICJFUEkiLCAiTUVTTyIsICJFTkVPTCIsICJMTkVPTCIpKSkKCnByaW50KG1lZGxhbmQuc3VydmV5LnJmLnByZWRpY3RlZCkKYGBgCgojIyMgQ2FsY3VsYXRlIGFnZSBwcm9iYWJpbGl0aWVzIHRvIGFzc2lnbiB0byBjb2xsZWN0aW9ucyB3aXRoIG9ubHkgdW5kaWFnb3N0aWMgbGl0aGljcwpVc2UgdGhlIDEwdGggcGVyY2VudGlsZSBvZiBwcm9iYWJpbGl0aWVzIGZyb20gcmFuZG9tIGZvcmVzdCBtb2RlbCB3aXRoIGRhdGVkIGNvbGxlY3Rpb25zCgpgYGB7cn0KdmFsZW5jaWEubGl0aGljcy5yZi5wcm9icXVhbnRpbGVzIDwtIHdpdGgodmFsZW5jaWEubGl0aGljcy5yZi54di5wcmVkaWN0aW9ucyAlPiUgCiAgICAgICBwaXZvdF9sb25nZXIoY29scyA9IDQ6bmNvbCh2YWxlbmNpYS5saXRoaWNzLnJmLnh2LnByZWRpY3Rpb25zKSwgCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInByb2JhYmlsaXR5IiksIAogICAgICAgcXVhbnRpbGUocHJvYmFiaWxpdHksIHByb2JzID0gYyguMSwgLjI1LCAuNSwgLjc1KSkpIAoKcHJpbnQocGFzdGUoIjEwdGggcGVyY2VudGlsZSBvZiByYW5kb20gZm9yZXN0IHByb2JhYmlsaXRpZXMgPSIsIAogICAgICAgICAgICB2YWxlbmNpYS5saXRoaWNzLnJmLnByb2JxdWFudGlsZXNbMV0pKQoKYGBgCgojIyMgT3B0aW9uYWwgR3JhcGg6IHNob3cgcXVhbnRpbGVzIGZvciByYW5kb20gZm9yZXN0IHByb2JhYmlsaXRpZXMKCmBgYHtyfQojIHNob3cgdGhpcyBpbiBhIGdyYXBoCnZhbGVuY2lhLmxpdGhpY3MucmYueHYucHJlZGljdGlvbnMgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gNDpuY29sKHZhbGVuY2lhLmxpdGhpY3MucmYueHYucHJlZGljdGlvbnMpLCBuYW1lc190byA9ICJwZXJpb2QiLCB2YWx1ZXNfdG8gPSAicHJvYmFiaWxpdHkiKSAlPiUgCiAgbXV0YXRlKHBlcmlvZCA9IGZhY3RvcihwZXJpb2QsIGxldmVscyA9IGMoIk1QIiwiVVAiLCJFUEkiLCJNRVNPIiwiRU5FT0wiLCJNTkVPTCIsIkxORU9MIikpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PXByb2JhYmlsaXR5KSkgKyAKICBnZW9tX2RlbnNpdHkoKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHZhbGVuY2lhLmxpdGhpY3MucmYucHJvYnF1YW50aWxlc1sxXSwgY29sb3IgPSAncmVkJykgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB2YWxlbmNpYS5saXRoaWNzLnJmLnByb2JxdWFudGlsZXNbMl0sIGNvbG9yID0gJ2dyZWVuJykgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB2YWxlbmNpYS5saXRoaWNzLnJmLnByb2JxdWFudGlsZXNbM10sIGNvbG9yID0gJ2JsdWUnKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHZhbGVuY2lhLmxpdGhpY3MucmYucHJvYnF1YW50aWxlc1s0XSwgY29sb3IgPSAnZ3JlZW4nKSArCiAgbGFicyh0aXRsZT0iRGlzdHJpYnV0aW9uIG9mIENvbWJpbmVkIFJhbmRvbSBGb3Jlc3QgUHJlZGljdGlvbnMiLCAKICAgICAgIHg9ImFnZSBwcmVkaWN0aW9uIHByb2JhYmlsaXRpZXMgXG4oYmx1ZSA9IG1lZGlhbiwgcmVkID0gMTB0aCBwZXJjZW50aWxlLCBncmVlbiA9IDI1dGggYW5kIDc1dGggcGVyY2VudGlsZSIpCgpgYGAKCiMjIyBDcmVhdGUgZmlsZXMgZm9yIGFkZGl0aW9uYWwgZ3JhcGhpbmcgYW5kIGZvciBvdXRwdXQgZm9yIG1hcHBpbmcKCmBgYHtyIE1lZGxhbmQgUkYgZmlsZSBmb3IgZ3JhcGhpbmd9CiMgQ3JlYXRlIGJhc2UgZmlsZSBmb3IgZ3JhcGhpbmcgYW5kIG91dHB1dAptZWRsYW5kLnN1cnZleS5yZi5ncmFwaCA8LSAgCiAgbGVmdF9qb2luKHNlbGVjdChtZWRsYW5kX3N1cnZleTIwMTRfMjAxNywgSUQsIHN0dWR5LmFyZWEsIHpvbmUsIHNlY3Rvciwgc3Vic2VjdG9yLCB0b3RhbC5saXRoaWNzLCBhcmVhLnNxbSkgJT4lIAogICAgICAgICAgICBtdXRhdGUoYXNzZW1ibGFnZSA9IHBhc3RlKHN0dWR5LmFyZWEsICItIiwgem9uZSwgIi0iLCBzZWN0b3IsICItIiwgc3Vic2VjdG9yLCBzZXAgPSAiIikpLCAKICAgICAgICAgICAgbWVkbGFuZC5zdXJ2ZXkucmYucHJlZGljdGVkKSAlPiUgCiAgZHBseXI6OmZpbHRlcih0b3RhbC5saXRoaWNzPjApICU+JSAKICBtdXRhdGUoZGVuc2l0eS5rbTIgPSB0b3RhbC5saXRoaWNzL2FyZWEuc3FtLzEwMDApCgojIENyZWF0ZSBvdXRwdXQgZmlsZQojIFVzZSAxMHRoIHBlcmNlbnRpbGUgZm9yIG92ZXJhbGwgdWJpcXVpdHkgZm9yIHBhdGNoZXMgd2l0aCBvbmx5IHVuZGlhZ25vc3RpYyBsaXRoaWNzCm1lZGxhbmQuc3VydmV5LnJmLm91dCA8LSBtZWRsYW5kLnN1cnZleS5yZi5ncmFwaCAlPiUgCiAgbXV0YXRlKE1QID0gcmVwbGFjZV9uYShNUCwgdmFsZW5jaWEubGl0aGljcy5yZi5wcm9icXVhbnRpbGVzWzFdKSwgCiAgICAgICAgIFVQID0gcmVwbGFjZV9uYShVUCwgdmFsZW5jaWEubGl0aGljcy5yZi5wcm9icXVhbnRpbGVzWzFdKSwgCiAgICAgICAgIEVQSSA9IHJlcGxhY2VfbmEoRVBJLCB2YWxlbmNpYS5saXRoaWNzLnJmLnByb2JxdWFudGlsZXNbMV0pLCAKICAgICAgICAgTUVTTyA9IHJlcGxhY2VfbmEoTUVTTywgdmFsZW5jaWEubGl0aGljcy5yZi5wcm9icXVhbnRpbGVzWzFdKSwgCiAgICAgICAgIEVORU9MID0gcmVwbGFjZV9uYShFTkVPTCwgdmFsZW5jaWEubGl0aGljcy5yZi5wcm9icXVhbnRpbGVzWzFdKSwgCiAgICAgICAgIExORU9MID0gcmVwbGFjZV9uYShMTkVPTCwgdmFsZW5jaWEubGl0aGljcy5yZi5wcm9icXVhbnRpbGVzWzFdKSkgJT4lIAogICMgb2NjdXBhdGlvbmFsIHViaXF1aXR5CiAgcmVuYW1lKE1QX3ViaXEgPSBNUCwgCiAgICAgICAgIFVQX3ViaXEgPSBVUCwgCiAgICAgICAgIEVQSV91YmlxID0gRVBJLCAKICAgICAgICAgTUVTT191YmlxID0gTUVTTywKICAgICAgICAgRU5FT0xfdWJpcSA9IEVORU9MLCAKICAgICAgICAgTE5FT0xfdWJpcSA9IExORU9MKSAlPiUgCiAgIyBjYWxjdWxhdGUgb2NjdXBhdGlvbmFsIGludGVuc2l0eQogIG11dGF0ZShNUF9pbnQgPSBNUF91YmlxKmRlbnNpdHkua20yLzgwMCwgCiAgICAgICAgIFVQX2ludCA9IFVQX3ViaXEqZGVuc2l0eS5rbTIvMjUwLCAKICAgICAgICAgRVBJX2ludCA9ICBFUElfdWJpcSpkZW5zaXR5LmttMi80MCwgCiAgICAgICAgIE1FU09faW50ID0gTUVTT191YmlxKmRlbnNpdHkua20yLzM1LCAKICAgICAgICAgRU5FT0xfaW50ID0gRU5FT0xfdWJpcSpkZW5zaXR5LmttMi8yNSwgCiAgICAgICAgIExORU9MX2ludCA9IExORU9MX3ViaXEqZGVuc2l0eS5rbTIvMTIpCgojIGNyZWF0ZSBmaWxlIHRvIGdyYXBoIHJlc3VsdHMgb2YgcGF0Y2hlcyB3aXRoIGRpYWdub3N0aWMgbGl0aGljcwptZWRsYW5kLnN1cnZleS5yZi5ncmFwaCA8LSAgbWVkbGFuZC5zdXJ2ZXkucmYuZ3JhcGggJT4lIAogIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKHByZWRpY3RlZC5wZXJpb2QpKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAxMDoxNSwgCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInBlcmlvZCIsIAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAidWJpcXVpdHkiKSAlPiUgCiAgIG11dGF0ZShwZXJpb2QgPSBmYWN0b3IocGVyaW9kLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk1QIiwiVVAiLCJFUEkiLCJNRVNPIiwiRU5FT0wiLCJNTkVPTCIsIkxORU9MIikpLAogICAgICAgICBhZ2UgPSBjYXNlX3doZW4ocGVyaW9kID09ICJNUCIgfiA4MDAwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QgPT0gIlVQIiB+IDI1MDAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZCA9PSAiRVBJIiB+IDEzMDAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZCA9PSAiTUVTTyIgfiA5MDAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZCA9PSAiRU5FT0wiIH4gNjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZCA9PSAiTE5FT0wiIH4gNDAwMCksIAogICAgICAgICBwcmVkaWN0ZWQuYWdlID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkLnBlcmlvZCA9PSAiTVAiIH4gODAwMDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkLnBlcmlvZCA9PSAiVVAiIH4gMjUwMDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkLnBlcmlvZCA9PSAiRVBJIiB+IDEzMDAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RlZC5wZXJpb2QgPT0gIk1FU08iIH4gOTAwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0ZWQucGVyaW9kID09ICJFTkVPTCIgfiA2MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkLnBlcmlvZCA9PSAiTE5FT0wiIH4gNDAwMCksIAogICAgICAgICBkdXJhdGlvbi5jZW50dXJpZXMgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QgPT0gIk1QIiB+IDgwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QgPT0gIlVQIiB+IDI1MCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QgPT0gIkVQSSIgfiA0MCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QgPT0gIk1FU08iIH4gMzUsIAogICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kID09ICJFTkVPTCIgfiAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZCA9PSAiTE5FT0wiIH4gMTIpKQpgYGAKCiMjIyBPcHRpb25hbCBHcmFwaDogb2NjdXBhdGlvbmFsIHViaXF1aXR5IGZvciBhbGwgc3VydmV5IHBhdGNoZXMgd2l0aCBkaWFnbm9zdGljIGxpdGhpY3MKICAgICAgICAgICAgICAgICAgICAgICAgIApgYGB7ciBNZWRsYW5kIFJGIGdyYXBoIHViaXF1aXR5IHByZWRpY3Rpb25zLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MTAsIHdhcm5pbmc9RkFMU0V9Cm1lZGxhbmQuc3VydmV5LnJmLmdyYXBoICU+JSAKICBnZ3Bsb3QoYWVzKHg9cGVyaW9kLCB5PXViaXF1aXR5KSkgKyAKICBnZW9tX3JlY3QoYWVzKGZpbGwgPSBzdHVkeS5hcmVhKSx4bWluID0gLUluZix4bWF4ID0gSW5mLCB5bWluID0gLUluZix5bWF4ID0gSW5mLGFscGhhID0gMC4xKSArCiAgZ2VvbV9saW5lKGdyb3VwPTEpICsgCiAgI2dlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBwcmVkaWN0ZWQucGVyaW9kKSwgY29sb3I9ImJsdWUiKSArIAogIGxhYnModGl0bGU9IlJhbmRvbSBGb3Jlc3QgQWdlIEVzdG1hdGVzIGZvciBNZWRsYW5kIFN1cnZleSBEYXRhIiwgCiAgICAgICBzdWJ0aXRsZT0iVGltZSBQZXJpb2RzIGZvciBFYWNoIEFzc2VtYmxhZ2UsIENvbG9yZWQgYnkgU3R1ZHkgQXJlYSIsCiAgICAgICB4PSJwcmVkaWN0ZWQgdGltZSBwZXJpb2RcbihibHVlIGxpbmUgaW5kaWNhdGVzIG1heGltdW0gcHJlZGljdGVkIHByb2JhYmlsaXR5KSIpICsKICBmYWNldF93cmFwKH4gYXNzZW1ibGFnZSArIElEKSArIAogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSwgaGp1c3Q9MSkpCgpgYGAKCiMjIyBPcHRpb25hbCBHcmFwaDogbGFuZCB1c2UgaW50ZW5zaXR5IGZvciBhbGwgc3VydmV5IHBhdGNoZXMgd2l0aCBkaWFnbm9zdGljIGxpdGhpY3MKICAgICAgICAgICAgICAgICAgICAgICAgIApgYGB7ciBNZWRsYW5kIFJGIGdyYXBoIGludGVuc2l0eSBwcmVkaWN0aW9ucywgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTEwLCB3YXJuaW5nPUZBTFNFfQptZWRsYW5kLnN1cnZleS5yZi5ncmFwaCAlPiUgCiAgZ2dwbG90KGFlcyh4PXBlcmlvZCwgeT11YmlxdWl0eSpkZW5zaXR5LmttMi9kdXJhdGlvbi5jZW50dXJpZXMpKSArIAogIGdlb21fcmVjdChhZXMoZmlsbCA9IHN0dWR5LmFyZWEpLHhtaW4gPSAtSW5mLHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLHltYXggPSBJbmYsYWxwaGEgPSAwLjEpICsKICBnZW9tX2xpbmUoZ3JvdXA9MSkgKyAKICAjZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IHByZWRpY3RlZC5wZXJpb2QpLCBjb2xvcj0iYmx1ZSIpICsgCiAgbGFicyh0aXRsZT0iTGFuZCBVc2UgSW50ZW5zaXR5IEVzdG1hdGVzIGZvciBNZWRsYW5kIFN1cnZleSBEYXRhIiwgCiAgICAgICBzdWJ0aXRsZT0iVGltZSBQZXJpb2RzIGZvciBFYWNoIEFzc2VtYmxhZ2UsIENvbG9yZWQgYnkgU3R1ZHkgQXJlYSIsCiAgICAgICB4PSJwcmVkaWN0ZWQgdGltZSBwZXJpb2RcbihibHVlIGxpbmUgaW5kaWNhdGVzIG1heGltdW0gcHJlZGljdGVkIHByb2JhYmlsaXR5KSIsCiAgICAgICB5PSJlc3RpbWF0ZWQgYXJ0aWZhY3QgYWNjdW11bGF0aW9uIHJhdGVcbihhcnRpZmFjdHMva20yL2NlbnR1cnkpIikgKwogIGZhY2V0X3dyYXAofiBhc3NlbWJsYWdlICsgSUQpICsgCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAxLCBoanVzdD0xKSkKCmBgYAoKIyMjIEZpZ3VyZSA2YQoKYGBge3IgRmlndXJlOiBNZWRsYW5kIFJGIGdyYXBoIHViaXF1aXR5LCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD02LCB3YXJuaW5nPUZBTFNFfQptZWRsYW5kLnN1cnZleS5yZi5ncmFwaCAlPiUgCiAgZHBseXI6OmZpbHRlcihJRD09MjM4IHwgSUQ9PTk2MCkgJT4lIApnZ3Bsb3QoYWVzKHg9cGVyaW9kLCB5PXViaXF1aXR5KSkgKyAKICBnZW9tX2xpbmUoZ3JvdXA9MSwgc2l6ZT0yKSArIAogIGxhYnModGl0bGU9Ik9jY3VwYXRpb25hbCBVYmlxdWl0eSBmb3IgMiBTdXJ2ZXkgUGF0Y2hlcyIsIAogICAgICAgc3VidGl0bGU9IlJhbmRvbSBGb3Jlc3QgQWdlIEVzdG1hdGVzIiwKICAgICAgIHg9InByZWRpY3RlZCB0aW1lIHBlcmlvZCIsIAogICAgICAgeT0ib2NjdXBhdGlvbmFsIHViaXF1aXR5IikgKwogIGZhY2V0X3dyYXAofiBhc3NlbWJsYWdlKSArIAogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDIwKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSwgaGp1c3Q9MSkpCgpgYGAKCiMjIyBGaWd1cmUgNmIKCmBgYHtyIEZpZ3VyZTogTWVkbGFuZCBSRiBncmFwaCBpbnRlbnNpdHksIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTYsIHdhcm5pbmc9RkFMU0V9Cm1lZGxhbmQuc3VydmV5LnJmLmdyYXBoICU+JSAKICBkcGx5cjo6ZmlsdGVyKElEPT0yMzggfCBJRD09OTYwKSAlPiUgCmdncGxvdChhZXMoeD1wZXJpb2QsIHk9dWJpcXVpdHkqZGVuc2l0eS5rbTIvZHVyYXRpb24uY2VudHVyaWVzKSkgKyAKICBnZW9tX2xpbmUoZ3JvdXA9MSwgc2l6ZT0yKSArIAogIGxhYnModGl0bGU9IkxhbmQgVXNlIEludGVuc2l0eSBmb3IgMiBTdXJ2ZXkgUGF0Y2hlcyIsIAogICAgICAgc3VidGl0bGU9IlJhbmRvbSBGb3Jlc3QgQWdlIEVzdG1hdGVzIiwKICAgICAgIHg9InByZWRpY3RlZCB0aW1lIHBlcmlvZCIsIAogICAgICAgeT0iYXJ0aWZhY3RzIC8ga21eMiAvY2VudHVyeSIpICsKICBmYWNldF93cmFwKH4gYXNzZW1ibGFnZSkgKyAKICB0aGVtZV9idyhiYXNlX3NpemUgPSAyMCkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IDEsIGhqdXN0PTEpLCAKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCkpIAoKYGBgCgoKIyMjIyBTYXZlIHJhbmRvbSBmb3Jlc3QgZGF0aW5nIGZpbGUgdG8gY3N2IGZvciBtYXBwb2luZyBpbiBHSVMKCmBgYHtyIE1lZGxhbmQgUkYgb3V0cHV0fQp3cml0ZV9jc3YobWVkbGFuZC5zdXJ2ZXkucmYub3V0LCAibWVkbGFuZF9zdXJ2ZXlfcmYuY3N2IikKYGBgCgoKIyMgQWdncmVnYXRlIHN1bW1hcmllcyBvZiB1YmlxdWl0eSBhbmQgaW50ZW5zaXR5IGZvciBlYWNoIHZhbGxleQoKIyMjIENhbGN1YXRlIGFyZWEgc3VydmV5ZWQgdG90YWxzIGZvciBlYWNoIHZhbGxleQpgYGB7cn0KdG90YWxzLnN1cnZleWVkIDwtIG1lZGxhbmRfc3VydmV5MjAxNF8yMDE3ICU+JSAKICBzZWxlY3Qoc3R1ZHkuYXJlYSwgYXJlYS5zcW0pICU+JSAKICBncm91cF9ieShzdHVkeS5hcmVhKSAlPiUgCiAgc3VtbWFyaXNlKHRvdGFsLmFyZWEuc3FtPXN1bShhcmVhLnNxbSkpCmBgYAoKIyMjIEZpZ3VyZSAxMGE6IGFnZ3JlZ2F0ZSB1YmlxdWl0eSBmb3IgZWFjaCB2YWxsZXkKYGBge3IgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9M30KbGVmdF9qb2luKG1lZGxhbmQuc3VydmV5LnJmLmdyYXBoLCB0b3RhbHMuc3VydmV5ZWQpICU+JSAKICBkcGx5cjo6ZmlsdGVyKHViaXF1aXR5ID4gcXVhbnRpbGUobWVkbGFuZC5zdXJ2ZXkucmYuZ3JhcGgkdWJpcXVpdHksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYnMgPSAuNSkpICU+JSAKICBncm91cF9ieShzdHVkeS5hcmVhLCBwZXJpb2QpICU+JSAKICBzdW1tYXJpemUoYXJlYS5zdW0gPSBzdW0oYXJlYS5zcW0pLCAKICAgICAgICAgICAgdG90YWwuYXJlYS5zcW0gPSBmaXJzdCh0b3RhbC5hcmVhLnNxbSkpICU+JSAKICBzZWxlY3Qoc3R1ZHkuYXJlYSwgcGVyaW9kLCBhcmVhLnN1bSwgdG90YWwuYXJlYS5zcW0pICU+JSAKICBtdXRhdGUocGN0LmNvdmVyYWdlID0gYXJlYS5zdW0vdG90YWwuYXJlYS5zcW0pICU+JSAKICB1bmdyb3VwKCkgICU+JSAKICBhZGRfcm93KHN0dWR5LmFyZWEgPSAiQ2FuYWwgZGUgTmF2YXJyw6lzIiwKICAgICAgICAgIHBlcmlvZCA9ICJFUEkiLAogICAgICAgICAgYXJlYS5zdW0gPSAwLAogICAgICAgICAgdG90YWwuYXJlYS5zcW0gPSA0MTA3NTgyLAogICAgICAgICAgcGN0LmNvdmVyYWdlID0gMCkgJT4lCiAgYWRkX3JvdyhzdHVkeS5hcmVhID0gIkNvY2luYS9DYXRhZGF1IiwKICAgICAgICAgIHBlcmlvZCA9ICJFUEkiLAogICAgICAgICAgYXJlYS5zdW0gPSAwLAogICAgICAgICAgdG90YWwuYXJlYS5zcW0gPSAxMDk1NjgzLAogICAgICAgICAgcGN0LmNvdmVyYWdlID0gMCkgJT4lCiAgYWRkX3JvdyhzdHVkeS5hcmVhID0gIkNvY2luYS9DYXRhZGF1IiwKICAgICAgICAgIHBlcmlvZCA9ICJNRVNPIiwKICAgICAgICAgIGFyZWEuc3VtID0gMCwKICAgICAgICAgIHRvdGFsLmFyZWEuc3FtID0gMTA5NTY4MywKICAgICAgICAgIHBjdC5jb3ZlcmFnZSA9IDApICU+JQogIGFkZF9yb3coc3R1ZHkuYXJlYSA9ICJIb3lhIGRlIEJ1w7FvbCIsCiAgICAgICAgICBwZXJpb2QgPSAiRVBJIiwKICAgICAgICAgIGFyZWEuc3VtID0gMCwKICAgICAgICAgIHRvdGFsLmFyZWEuc3FtID0gMTU1MTM3NywKICAgICAgICAgIHBjdC5jb3ZlcmFnZSA9IDApICU+JSAKCiMgTmVlZGVkIGZvciBvcHRpb25hbCB1cHBlciBxdWFydGlsZSBncmFwaGluZyAgIAogICMgYWRkX3JvdyhzdHVkeS5hcmVhID0gIkNhbmFsIGRlIE5hdmFycsOpcyIsCiAgIyAgICAgICAgIHBlcmlvZCA9ICJNUCIsCiAgIyAgICAgICAgIGFyZWEuc3VtID0gMCwKICAjICAgICAgICAgdG90YWwuYXJlYS5zcW0gPSA0MTA3NTgyLAogICMgICAgICAgICBwY3QuY292ZXJhZ2UgPSAwKSAlPiUKICAjIGFkZF9yb3coc3R1ZHkuYXJlYSA9ICJDYW5hbCBkZSBOYXZhcnLDqXMiLAogICMgICAgICAgICBwZXJpb2QgPSAiTUVTTyIsCiAgIyAgICAgICAgIGFyZWEuc3VtID0gMCwKICAjICAgICAgICAgdG90YWwuYXJlYS5zcW0gPSA0MTA3NTgyLAogICMgICAgICAgICBwY3QuY292ZXJhZ2UgPSAwKSAlPiUKICAjIGFkZF9yb3coc3R1ZHkuYXJlYSA9ICJDYW5hbCBkZSBOYXZhcnLDqXMiLAogICMgICAgICAgICBwZXJpb2QgPSAiTE5FT0wiLAogICMgICAgICAgICBhcmVhLnN1bSA9IDAsCiAgIyAgICAgICAgIHRvdGFsLmFyZWEuc3FtID0gNDEwNzU4MiwKICAjICAgICAgICAgcGN0LmNvdmVyYWdlID0gMCkgJT4lCiAgIyBhZGRfcm93KHN0dWR5LmFyZWEgPSAiQ29jaW5hL0NhdGFkYXUiLAogICMgICAgICAgICBwZXJpb2QgPSAiTVAiLAogICMgICAgICAgICBhcmVhLnN1bSA9IDAsCiAgIyAgICAgICAgIHRvdGFsLmFyZWEuc3FtID0gMTA5NTY4MywKICAjICAgICAgICAgcGN0LmNvdmVyYWdlID0gMCkgJT4lCiAgIyBhZGRfcm93KHN0dWR5LmFyZWEgPSAiQ29jaW5hL0NhdGFkYXUiLAogICMgICAgICAgICBwZXJpb2QgPSAiTE5FT0wiLAogICMgICAgICAgICBhcmVhLnN1bSA9IDAsCiAgIyAgICAgICAgIHRvdGFsLmFyZWEuc3FtID0gMTA5NTY4MywKICAjICAgICAgICAgcGN0LmNvdmVyYWdlID0gMCkgJT4lCiAgIyBhZGRfcm93KHN0dWR5LmFyZWEgPSAiSG95YSBkZSBCdcOxb2wiLAogICMgICAgICAgICBwZXJpb2QgPSAiTVAiLAogICMgICAgICAgICBhcmVhLnN1bSA9IDAsCiAgIyAgICAgICAgIHRvdGFsLmFyZWEuc3FtID0gMTU1MTM3NywKICAjICAgICAgICAgcGN0LmNvdmVyYWdlID0gMCkgJT4lIAogICMgYWRkX3JvdyhzdHVkeS5hcmVhID0gIkhveWEgZGUgQnXDsW9sIiwKICAjICAgICAgICAgcGVyaW9kID0gIk1FU08iLAogICMgICAgICAgICBhcmVhLnN1bSA9IDAsCiAgIyAgICAgICAgIHRvdGFsLmFyZWEuc3FtID0gMTU1MTM3NywKICAjICAgICAgICAgcGN0LmNvdmVyYWdlID0gMCkgJT4lIAogICMgYWRkX3JvdyhzdHVkeS5hcmVhID0gIkhveWEgZGUgQnXDsW9sIiwKICAjICAgICAgICAgcGVyaW9kID0gIkxORU9MIiwKICAjICAgICAgICAgYXJlYS5zdW0gPSAwLAogICMgICAgICAgICB0b3RhbC5hcmVhLnNxbSA9IDE1NTEzNzcsCiAgIyAgICAgICAgIHBjdC5jb3ZlcmFnZSA9IDApICU+JSAKICAKICAgIAogIGdncGxvdChhZXMoeD1mYWN0b3IocGVyaW9kLCBsZXZlbHMgPSAKICAgICAgICAgICAgICAgICAgYygnTVAnLCdVUCcsJ0VQSScsJ01FU08nLCdFTkVPTCcsJ0xORU9MJykpLAogICAgICAgICAgICAgeT1wY3QuY292ZXJhZ2UsIGdyb3VwPTEpKSArIAogIGdlb21fbGluZShsd2Q9MS41KSArIAogIGZhY2V0X3dyYXAofnN0dWR5LmFyZWEsIG5jb2wgPSAxKSArIAogIGxhYnModGl0bGU9J0FnZ3JlZ2F0ZSBPY2N1cGF0aW9uYWwgVWJpcXVpdHknLCAKICAgICAgIHN1YnRpdGxlPSdQcm9wb3J0aW9uIG9mIHN0dWR5IGFyZWEgc3VydmV5ZWRcbndpdGggdWJpcXVpdHkgYWJvdmUgdGhlIG1lZGlhbicsIAogICAgICAgeD0ncGVyaW9kJywgCiAgICAgICB5PSdwcm9wb3J0aW9uJykgKyAKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikKYGBgCgojIyMgRmlndXJlIDEwYjogYWdncmVnYXRlIGludGVuc2l0eSBmb3IgZWFjaCB2YWxsZXkKCmBgYHtyIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTN9CmxlZnRfam9pbihtZWRsYW5kLnN1cnZleS5yZi5ncmFwaCwgdG90YWxzLnN1cnZleWVkKSAlPiUgCiAgbXV0YXRlKGludGVuc2l0eSA9IHViaXF1aXR5KmRlbnNpdHkua20yL2R1cmF0aW9uLmNlbnR1cmllcykgJT4lIAogIGRwbHlyOjpmaWx0ZXIoaW50ZW5zaXR5ID49IHF1YW50aWxlKG1lZGxhbmQuc3VydmV5LnJmLmdyYXBoJHViaXF1aXR5Km1lZGxhbmQuc3VydmV5LnJmLmdyYXBoJGRlbnNpdHkua20yL21lZGxhbmQuc3VydmV5LnJmLmdyYXBoJGR1cmF0aW9uLmNlbnR1cmllcywgcHJvYnMgPS41KSkgJT4lIAogIGdyb3VwX2J5KHN0dWR5LmFyZWEsIHBlcmlvZCkgJT4lIAogIHN1bW1hcml6ZShhcmVhLnN1bSA9IHN1bShhcmVhLnNxbSksIAogICAgICAgICAgICB0b3RhbC5hcmVhLnNxbSA9IGZpcnN0KHRvdGFsLmFyZWEuc3FtKSwgCiAgICAgICAgICAgIGRlbnNpdHkua20yID0gZmlyc3QoZGVuc2l0eS5rbTIpKSAlPiUgCiAgc2VsZWN0KHN0dWR5LmFyZWEsIHBlcmlvZCwgYXJlYS5zdW0sIHRvdGFsLmFyZWEuc3FtKSAlPiUgCiAgbXV0YXRlKHBjdC5jb3ZlcmFnZSA9IGFyZWEuc3VtL3RvdGFsLmFyZWEuc3FtKSAlPiUgCiAgdW5ncm91cCAlPiUKICBhZGRfcm93KHN0dWR5LmFyZWEgPSAiQ2FuYWwgZGUgTmF2YXJyw6lzIiwKICAgICAgICAgIHBlcmlvZCA9ICJNUCIsCiAgICAgICAgICBhcmVhLnN1bSA9IDAsCiAgICAgICAgICB0b3RhbC5hcmVhLnNxbSA9IDQxMDc1ODIsCiAgICAgICAgICBwY3QuY292ZXJhZ2UgPSAwKSAlPiUgCiAgYWRkX3JvdyhzdHVkeS5hcmVhID0gIkhveWEgZGUgQnXDsW9sIiwKICAgICAgICAgIHBlcmlvZCA9ICJNUCIsCiAgICAgICAgICBhcmVhLnN1bSA9IDAsCiAgICAgICAgICB0b3RhbC5hcmVhLnNxbSA9IDE1NTEzNzcsCiAgICAgICAgICBwY3QuY292ZXJhZ2UgPSAwKSAlPiUgCiAgICAKIyBOZWVkZWQgZm9yIG9wdGlvbmFsIHVwcGVyIHF1YXJ0aWxlIGdyYXBoaW5nCiAgIyBhZGRfcm93KHN0dWR5LmFyZWEgPSAiSG95YSBkZSBCdcOxb2wiLAogICMgICAgICAgICBwZXJpb2QgPSAiVVAiLAogICMgICAgICAgICBhcmVhLnN1bSA9IDAsCiAgIyAgICAgICAgIHRvdGFsLmFyZWEuc3FtID0gMTU1MTM3NywKICAjICAgICAgICAgcGN0LmNvdmVyYWdlID0gMCkgJT4lIAogICAgICAKICBnZ3Bsb3QoYWVzKHg9ZmFjdG9yKHBlcmlvZCwgbGV2ZWxzID0gCiAgICAgICAgICAgICAgICAgIGMoJ01QJywnVVAnLCdFUEknLCdNRVNPJywnRU5FT0wnLCdMTkVPTCcpKSwKICAgICAgICAgICAgIHk9cGN0LmNvdmVyYWdlLCBncm91cD0xKSkgKyAKICBnZW9tX2xpbmUobHdkPTEuNSkgKyAKICBmYWNldF93cmFwKH5zdHVkeS5hcmVhLCBuY29sID0gMSkgKyAKICBsYWJzKHRpdGxlPSdBZ2dyZWdhdGUgTGFuZCBVc2UgSW50ZW5zaXR5JywgCiAgICAgICBzdWJ0aXRsZT0nUHJvcG9ydGlvbiBvZiBzdHVkeSBhcmVhIHN1cnZleWVkXG53aXRoIGludGVuc2l0eSBhYm92ZSB0aGUgbWVkaWFuJywgCiAgICAgICB4PSdwZXJpb2QnLCAKICAgICAgIHk9J3Byb3BvcnRpb24nKSArIAogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KQpgYGAKCgojIEZpZ3VyZSAxMTogU1BEIEFuYWx5c2VzIG9mIFByZWhpc3RvcmljIERlbW9ncmFwaHkKCiMjIFByZXBhcmUgRGF0YQpPbmx5IHVzZSBkYXRlcyB3aXRoIENPViDiiaQgMC4wNQpgYGB7cn0KQzE0X1NFX0liZXJpYV9hbGwgPC0gQzE0X1NFX0liZXJpYV9hbGwgJT4lIGRwbHlyOjpmaWx0ZXIoQzE0LkNWPDAuMDUgJiBDMTQuU0Q+MCkKYGBgCgojIyBDYWxpYnJhdGUgRGF0ZXMgd2l0aCBCQ2hyb24KCmBgYHtyIGNhbGlicmF0ZX0KYWxsLmRhdGVzLmNhbGlicmF0ZWQgPC0gd2l0aChDMTRfU0VfSWJlcmlhX2FsbCwgQmNocm9uQ2FsaWJyYXRlKGFnZXMgPSBDMTQubWVhbiwgYWdlU2RzID0gQzE0LlNELCBjYWxDdXJ2ZXMgPSBjYWxpYi5jdXJ2ZSwgcG9zaXRpb25zID0gc2l0ZSkpCgpDMTRfU0VfSWJlcmlhX2FsbCRCUC5jYWwubWVkaWFuIDwtIHNhcHBseSgxOmxlbmd0aChhbGwuZGF0ZXMuY2FsaWJyYXRlZCksIGZ1bmN0aW9uKHgpIHJvdW5kKG1lZGlhbihhbGwuZGF0ZXMuY2FsaWJyYXRlZFtbeF1dJGFnZUdyaWQpKSkKCmBgYAoKIyMgQmluIERhdGVzCmBgYHtyfQpDMTRfU0VfSWJlcmlhX2FsbC5iaW5zIDwtIEMxNF9TRV9JYmVyaWFfYWxsICU+JSAKICB3aXRoKC4sIGJpblByZXAoc2l0ZSwgQzE0Lm1lYW4sIDEwMCkpCmBgYAoKIyMgTW9kZWwgVGVzdApgYGB7cn0KQzE0X1NFX0liZXJpYV9hbGwubW9kZWx0ZXN0IDwtIEMxNF9TRV9JYmVyaWFfYWxsICU+JSAKICB3aXRoKC4sIGNhbGlicmF0ZSh4PUMxNC5tZWFuLCBlcnJvcnM9QzE0LlNELCBjYWxDdXJ2ZXMgPSBjYWxpYi5jdXJ2ZSwgbm9ybWFsaXNlZD1UUlVFLCBjYWxNYXRyaXg9RkFMU0UpKSAlPiUgCiAgbW9kZWxUZXN0KC4sIAogICAgICAgICAgICBlcnJvcnMgPSBDMTRfU0VfSWJlcmlhX2FsbCRDMTQuU0QsIAogICAgICAgICAgICB0aW1lUmFuZ2UgPSBjKDM1MDAwLDMwMDApLCAKICAgICAgICAgICAgcnVubSA9IDUwMCwgCiAgICAgICAgICAgIG1vZGVsPSJleHBvbmVudGlhbCIsIAogICAgICAgICAgICBkYXRlbm9ybWFsaXNlZD1UUlVFLCAKICAgICAgICAgICAgbnNpbSA9IDIwMCwgCiAgICAgICAgICAgIG5jb3JlcyA9IG5jb3JlcywKICAgICAgICAgICAgbWV0aG9kID0gJ2NhbHNhbXBsZScsIAogICAgICAgICAgICBiaW5zID0gQzE0X1NFX0liZXJpYV9hbGwuYmlucykKYGBgCgojIyBQbG90IFNQRApgYGB7ciBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD00fQpwYXIobWFyPWMoNyw3LDcsMykpCnBsb3QoQzE0X1NFX0liZXJpYV9hbGwubW9kZWx0ZXN0LCB4bGltID0gYygzMDAwMCw0MDAwKSwgY29sLm9icyA9ICdibGFjaycsIGx3ZC5vYnMgPSA1LCBkcmF3YXhlcyA9IEYpCmF4aXMoMSwgY2V4LmF4aXMgPSAyLCBwb3MgPSAtLjAxLCBhdD0oc2VxKDMwMDAwLDAsIGJ5PS01MDAwKSkpCmF4aXMoMiwgY2V4LmF4aXMgPSAyLCBwb3MgPSAzMDIwMCkKbXRleHQoc2lkZT0xLCBsaW5lPTUsICJjYWxpYnJhdGVkIHllYXJzIEJQIiwgY2V4PTIuNSkKbXRleHQoc2lkZT0yLCBsaW5lPTQsICJzdW1tZWQgcHJvYmFiaWxpdHkgZGVuc2l0eSIsIGNleD0yLjUpCnRpdGxlKG1haW49cGFzdGUoIlNvdXRoZXJuIGFuZCBFYXN0ZXJuIEliZXJpYSBTUEQgKE4gPSAiLCBucm93KEMxNF9TRV9JYmVyaWFfYWxsKSwgIilcbiIpLCBjZXgubWFpbiA9IDMpCmBgYAoKCg==